关于 MIPS 中 beq 的数据危害和转发?

About data hazard and forwarding with beq in MIPS?

为什么第一个add需要转发?

                    # stage:
add , ,       # WB
add , ,       # MEM
nop                 # EX
beq , , target  # ID

因为beq需要</code>,如果第一个<code>add要执行WB-stage,那ID是beq是不是不需要转发-阶段,即将读取寄存器文件?我的书说 beq 之前的第二条和第三条指令需要转发以避免数据危险。


编辑:我在 this link slide page 11; another slide that solves my another confusing that the first add isn't needed is by another technique special hardware, slide page 58.

上找到了我的意思

在同步数字系统中,在一个周期内,有两个不同的相位。 在第一阶段,操作数通过运算符读取和转换。在第二阶段,结果数据被写入寄存器。 根据实现的不同,这些阶段可以对应于上半周期和下半周期,或者对应于时钟的完整周期和上升沿。

在任何一种情况下,重要的方面是可以读取(在第一阶段)和修改(在最后)同一个寄存器。这就是为什么可以执行

之类的操作的原因
pc <= pc+4

在一个周期内。

在你提出的问题中,确实是这样。

动作

  add , ,       # WB

将在第一阶段读取带有结果的流水线寄存器,并在循环结束时写入 $1。而

 beq , , target  # ID

将在第一阶段读取$1和$4,并在循环结束时将结果写入ppline寄存器。因此,如果不转发,将写入 $1 的先前值。

(根据下方评论编辑)

所有这些解释都是正确的,分支是处理标准硬件的。在这种情况下,比较由 ALU 在 "EX" 阶段完成,PC 在该阶段结束时更新。

但这会导致两个循环的分支惩罚。为了减少这种损失,可以添加硬件以在 ID 阶段执行比较。在这种情况下,如果比较需要计算一个值(在您的示例中为 $1),则需要暂停。