Assembly MIPS、流水线和分支延迟槽示例

Assembly MIPS、流水线和分支延迟槽示例,assembly,mips,pipeline,risc,Assembly,Mips,Pipeline,Risc,我正在准备考试,有这样的例子。以下代码: 1: SLL $1, $1, 2 2: LW $2, 1000($1) 3: BEQL $2, $0, END 4: ADDI $3, $2, 1 5: MULT $3, $2 6: MFLO $4 END: 7: J QUIT ... QUIT: 100: NOP 在RISC处理器(带有准MIPS指令集)上执行 五级管道 否旁路 否动态调度 分支延迟时隙 此外,我们还知道,分支不会被采用 我的任务是理解分支延迟槽在这种情况下是如何工作的,并构建正

我正在准备考试,有这样的例子。以下代码:

1: SLL $1, $1, 2
2: LW $2, 1000($1)
3: BEQL $2, $0, END
4: ADDI $3, $2, 1
5: MULT $3, $2
6: MFLO $4
END:
7: J QUIT
...
QUIT:
100: NOP
在RISC处理器(带有准MIPS指令集)上执行

  • 五级管道
  • 旁路
  • 动态调度
  • 分支延迟时隙
  • 此外,我们还知道,分支不会被采用
我的任务是理解分支延迟槽在这种情况下是如何工作的,并构建正确的管道图

我有一个官方的解决方案,它给出了下图,没有解释:

1: SLL $1, $1, 2         IDEMW  
2: LW $2, 1000($1)        I---DEMW  
3: BEQL $2, $0, END           I---DEMW  
4: ADDI $3, $2, 1                 IDx
5: MULT $3, $2                       IDEMW
6: MFLO $4                            I---DEMW
据我所知,ADDI在分支延迟槽中执行并停止 处理器理解后,该分支未被采用,这将导致错误的结果。我的问题是

  • 我说得对吗
  • 如果是,为什么ADDI在分支延迟槽中执行而不是跳转

CPU按顺序读取指令,即在执行过程中(已提取、解码,剩余的阶段正在处理,我不知道您的确切阶段,因此这只是一般说明)beql它将让管道的另一部分自由地提取下一条指令,但分支尚未完成,因此
PC
仍指向分支->后的下一条指令,即“分支延迟槽”

在经典MIPS上,下一条指令被提取、解码和执行,同时分支可能会也可能不会将PC修改为分支目标,因此每次都会执行分支延迟槽指令。仅当未发生分支时,执行后的下一条指令,即
PC
在“分支延迟槽”位置后继续执行。如果分支确实修改了
PC
,fetch+decode将注意并解码来自新目标的下一条指令,因此在经典MIPS上,分支延迟槽仅为1条指令“大”(我不知道更复杂的MIPS CPU是否可以有更多的阶段和更多的延迟槽可用,从技术上讲,5个阶段管道甚至5条指令延迟听起来是可能的,但实际使用起来可能会非常困难,听起来可能会产生更多的问题而不是帮助)

BEQL是一条更复杂的指令,如果分支条件失败,则在执行的中途终止延迟槽指令

有关BEQL的详细说明,请参见第45页

所以“NullifyCurrentInstruction()”可能是图中的“x”。图中的其余部分,我只是猜测,因为我没有研究您的5个阶段的细节,而是在获取和解码(?)之后的第二个
LW
发现它依赖于
$1
,因此它在depend阶段等待上一条指令
W
阶段。等等。
ADDI
不依赖任何东西,因此它几乎与
BEQL
并行执行,并在接近结束时终止

但我不明白为什么每次“我”阶段被释放时都没有“我”阶段,看起来“我”在等待什么,最后你最多可以同时看到2条指令

无论如何,如果不研究你问题中使用的CPU的技术细节,这是很难理解的,我不想研究它,我甚至不知道你有什么类型的CPU,以及从哪里获得它的技术文档


编辑:我将尝试提取pdf的相关部分也在这里,使这个答案不只是“链接”,但复制pdf可能是棘手的

BEQL
MIPS IV CPU的说明文件:

说明: 如果(
rs
=
rt
),则分支很可能
在分支延迟槽中,将18位有符号偏移量(16位偏移量字段左移2位)添加到分支后的指令地址(而不是分支本身),以形成PC相对有效的目标地址。
如果GPR
rs
和GPR
rt
的内容相等,则在执行延迟槽中的指令后将分支到目标地址。如果未执行分支,则不执行延迟槽中的指令

操作:
I:
tgt_偏移量← 符号延伸(偏移量| | 02)
条件← (GPR[rs]=GPR[rt])
I+1:
如果是条件,则
个人计算机← PC+tgt\U偏移量
否则
NullifyCurrentInstruction()
恩迪夫


CPU按顺序读取指令,即在执行过程中(已提取、解码,其余阶段正在处理,我不知道确切的阶段,因此这只是一般说明)对于
beql
它将让管道的另一部分自由获取下一条指令,但分支尚未完成,因此
PC
仍指向分支后的下一条指令->这就是“分支延迟槽”

在经典MIPS上,下一条指令被提取、解码和执行,同时分支可能会或可能不会将PC修改为分支目标,因此每次都会执行分支延迟槽指令。只有在没有发生分支时,执行后的下一条指令,即
PC
在分支结束后继续执行“分支延迟槽”按顺序定位。如果分支确实修改了
PC
,fetch+decode将注意并解码来自新目标的下一条指令,因此在经典MIPS中,分支延迟槽仅为1条指令“大”(我不知道更复杂的MIPS CPU是否可以有更多的阶段和更多的延迟槽可用,从技术上讲,5个阶段管道甚至5条指令延迟听起来是可能的,但实际使用起来可能会非常困难,听起来可能会产生更多的问题而不是帮助)

BEQL是一条更复杂的指令,如果分支条件失败,则在执行的中途终止延迟槽指令