假设您有一个带 PIPELINE 的 MIPS 处理器,但没有危险预防或转发,这是否是 NOP 的正确放置?

Assuming that you had a MIPS processer with PIPELINE but without hazard prevention nor forwarding, would this be the correct placement of NOP?

我想检查一下我的工作和对管道的理解,不幸的是 MARS 不支持这个功能所以很难验证我的假设。

我将说明放在电子表格中以帮助我了解正在发生的事情,我想确保这是正确的。我用蓝色来表示循环中的每个阶段,不像书上,我没有表示每个阶段发生在循环的哪一半(I.E WB在前半段,ID在后半段)

根据 Patterson 和 Hennessey 的著作,ID 阶段发生在最后,而 WB 处于开始阶段。

所以这应该意味着最后一个 SW 命令应该按预期工作,因为先前(有效指令)的 WB 出现在该周期的开始 - 而 ID 在尾部。

是的,看起来是正确的。

后继指令的 ID 阶段可以与前一个指令的 WB 阶段重叠,并仍然得到正确的值。

这是因为,对于 WB 中的一个,新数据已完全准备好在周期开始时进入寄存器——没有什么可计算的;完整的答案已在前一个周期结束时完全计算出来,因此回写记录的值中不需要更改任何位。 (与 ALU 运算相比,在 ALU 运算中,大量逻辑遵循前一个循环的输入,然后才能计算输出。)

在 ID 阶段,在寄存器文件中查找值,并且周期时间足够长以允许值稳定以包括在同一周期中发生的新写入的 WB 值,或者设计者将在寄存器文件中放置一个内部 bypass/forward。无论哪种方式,ID 阶段都将获得在同一周期内写入 (WB) 的寄存器的最新值,而不是先前的陈旧值。

他们的说法是 WB 发生在周期的前半部分,ID 发生在后半部分。然而,它实际上是在各种处理器内部实现的——这个想法是我们可以指望读取在同一个周期中写入的值。 (我相信他们没有说明他们是否建议使用时钟的其他转换(例如下降沿)来物理地将周期分成两半,但这是另一种实现可能性。)

来自同一本书:

(A read of a register during a clock cycle returns the value written at the end of the first half of the cycle, when such a write occurs.)

图 4.52 上的标题,以及,

The last potential hazard can be resolved by the design of the register file hardware: What happens when a register is read and written in the same clock cycle? We assume that the write is in the first half of the clock cycle and the read is in the second half, so the read delivers what is written. As is the case for many implementations of register files, we have no data hazard in this case.

来自图 4.52 正上方的正文。这些相同的文本出现在本书的 RISC V 版本中(尽管相对于图编号 4.50 而不是 4.52)。


我们还要注意,当引入转发(又名绕过)以减轻危害时(而不是程序员插入 nops),将需要从 EX->EX 以及 MEM-> 转发前任。第一个是 ALU 上的背靠背 RAW 冒险,第二个是 load-use RAW 冒险(背靠背)以及由一条指令分隔的 ALU 冒险!