使用流水线理解 MIPS 汇编

understanding MIPS assembly with pipelining

对于 MIPS 架构的标准 5 级流水线,假设一些指令相互依赖,如何将流水线气泡插入到以下汇编代码中?

I1: lw   , 0([=10=])
I2: lw   , 4([=10=])
I3: add  , ,       ; I1 & I2 -> I3
I4: sw   , 12([=10=])      ; I3 -> I4
I5: lw   , 8([=10=])
I6: add  , ,       ; I1 & I5 -> I6
I7: sw   , 16([=10=])      ; I6 -> I7

首先我们插入一个气泡,我们

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM
I3:            IF   ID    --
I4:                 IF    ID

如您所见,当I3停顿时,I4可以继续解码。对不对?接下来,

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    EX   MEM  WB
I4:                 IF    ID    --   --   EX   MEM   WB
I5:                       IF    ID   EX   MEM  WB 
I6:                             IF   ID   --   EX    MEM   WB
I7:                                  IF   ID   --    --    EX   MEM   WB

我认为 MIPS 的标准流水线是可能的,但有人说每当插入一个气泡时,整个流水线就会停滞。怎么算出来的?

在你之前的问题中,你使用的是帕特森的书,所以让我借用其中一张图表:

这里重要的一点是危险检测单元,它导致了气泡。如果您阅读了随附的文本,您就会知道这样做的方法是

  • NOP 输出控制信号,
  • 暂停 IF(保持 IF/ID 缓冲区固定,不要推进 PC)

这意味着你的管道图不能那样发生。每个周期不会有新的指令进入。还要考虑,如果您有不同的代码,您可能已经安排了硬件危险的发生,正如 Jester 所描述的那样。所以这显然很糟糕,解决方案是拖延 IF.

会发生这样的事情:

I1:  IF   ID   EX   MEM   WB 
I2:       IF   ID   EX    MEM   WB
I3:            IF   ID    --    --    --
I3:                 IF    ID    --    --    --
I3:                       IF    ID    EX    MEM   WB
I4:                             IF    ID    --    --    --

等等