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

时间:2019-01-08 18:27:24

标签: assembly mips cpu-architecture mips32 hazard

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

                    # stage:
add $1, $2, $3      # WB
add $4, $5, $6      # MEM
nop                 # EX
beq $1, $4, target  # ID

因为beq需要$1,所以如果第一个add将要执行WB阶段,那么从beq开始在ID阶段就不需要转发了,即将读取哪个寄存器文件?我的书说beq之前的第二和第三条指令需要转发,以避免数据危害。


编辑:我在this link slide page 11上发现了我的意思;另一张解决了我另一个不需要第一个add的困惑的幻灯片是另一种技术 special hardware, slide page 58

1 个答案:

答案 0 :(得分:4)

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

在任何一种情况下,重要的方面是可以读取(在第一阶段期间)并修改(最后)同一寄存器。这就是为什么可以执行类似动作的原因

pc <= pc+4

在一个周期内。

在您提出的问题中,正是这样。

动作

  add $1, $2, $3      # WB

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

 beq $1, $4, target  # ID

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

(根据下面的评论进行编辑)

所有这些说明都是正确的,只是分支是用标准硬件处理的。在这种情况下,比较是由ALU在“ EX”阶段完成的,而PC在此阶段结束时进行更新。

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