MIPS语言避免了管道停滞

时间:2015-11-26 10:01:10

标签: assembly mips pipeline hazard

关于在pattersson的书中考虑的MIPS汇编语言,我有一个问题,即在指令之间插入NOP以避免流水线停滞。

考虑以下代码

lw   $s5, -16($s5)
sw   $s5, -16($s5)
add  $s5, $s5, $s5

我们发现lwsw之间的$ s5存在RAW危险。 swadd之间的$ s5还存在WAW危险。因此我们必须插入两个NOP以避免失速。换句话说,管道图是

lw      IF     ID     EX     MEM     WB
sw             IF     ID     ---     EX     MEM     WB
add                   IF     ID      EX     MEM     --     WB

当要执行sw时,它等待lw将数据放入寄存器。因此,有一个泡沫。此外,当add想要写出最终结果时,它必须等待前一条指令(sw)的完成。那是另一个泡沫。

所以修改后的代码是

lw
NOP
sw
NOP
add

但解决方案提出以下代码

lw
NOP
NOP
sw
add

哪一个是正确的?我想我的!

1 个答案:

答案 0 :(得分:2)

假设一个相当标准的管道,WAW危险不存在,它可能在程序代码中看起来有点危险(从某种意义上说,对同一个寄存器有多次写入),但是没有机制ADD可以在LW之前(或期间)完成(这意味着它在输入可用之前计算结果)。 SW不会写入寄存器,因此无关紧要,但ADD也无法在其之前完成。实际上,标准管道中根本不存在WAW危险因为指令只是按顺序回写。

您对RAW危险的解决方案假设存在WB-> EX转发,根据其解决方案判断,没有。如果没有转发器,最快可以使用的结果是当读取指令的ID与写入指令的WB对齐时。

  

为什么(WB)和(EX)不会在一个周期内执行?

因为它不起作用。它在问题a中也不起作用,所以我不确定那里发生了什么。这个问题的前提是没有转发到EX,所以和以前一样,最快的是你可以在生成后使用一个值,当你用读写指令的WB将读取指令的ID排成一行时。 EX只从ID / EX流水线寄存器读取其输入。

  

此外,对于(a),我从I1到I3没有看到任何6美元的WAR。你呢??

不,因为I1和I3都没有修改6美元,所以不可能有任何危险。 RAR不是危险因素。