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

1 assembly pipeline mips 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
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

据我了解,ADDI 在分支延迟槽中执行,并在处理器理解后停止,该分支未被采用,这导致我们得到错误的结果。我的问题是

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

Ped*_*d7g 5

CPU继续按顺序读取指令,即在执行期间(已经获取、解码,剩余阶段正在处理,我不知道你的确切阶段,所以这只是一般描述)它beql会得到另一部分管道可以自由获取下一条指令,但分支尚未完成,因此PC仍然指向分支后的下一条指令 - >这就是“分支延迟槽”。

\n\n

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

\n\n

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

\n\n

有关 的详细说明,请参阅http://math-atlas.sourceforge.net/devel/assemble/mips-iv.pdfBEQL第 45 页。

\n\n

因此“NullifyCurrentInstruction()”可能就是图中的“x”。图中的其余内容,我只是猜测,因为我没有研究您的 5 个阶段细节,但LW在获取和解码(?)之后发现它依赖于$1,因此它在依赖阶段等待上一个指令阶段W。等等...ADDI不依赖于任何东西,所以它几乎与 并行执行BEQL,并在最后被杀死。

\n\n

但我不明白为什么每次“I”阶段被释放时都没有“I”阶段,看起来“I”在等待某些东西,最后你最多有2条指令在进行同一时间。

\n\n

不管怎样,如果不研究你的问题中使用的CPU的技术细节,这是相当难以理解的,我不想研究它,我什至不确定你有什么样的CPU,以及从哪里得到它\的技术文档。

\n\n
\n\n

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

\n\n

BEQLMIPS IV CPU的指令文档:

\n\n
\n

说明:\n if ( rs= rt) thenbranch_likely
\n 一个 18 位有符号偏移量(16 位偏移量字段左移 2 位)被添加到分支后面的指令地址(不是分支本身),在分支延迟槽,形成PC相对的有效目标地址。\n 如果 GPR和 GPR
的内容相等,则执行延迟槽中的指令后跳转到目标地址。如果不发生分支,则不执行延迟槽中的指令。 rsrt

\n\n

操作:
\n I:
\n tgt_offset \xe2\x86\x90 sign_extend(offset || 0 2 )
\n 条件 \xe2\x86\x90 (GPR[rs] = GPR[rt])
\n I+1:
\ n if 条件 then
\n PC \xe2\x86\x90 PC + tgt_offset
\n else
\n NullifyCurrentInstruction()
\n endif

\n
\n