我正在使用Verilog设计类似MIPS的CPU,现在我正在处理数据危害。 我有这些指示:
Ins[0] = LW r1 r0(100)
Ins[1] = LW r2 r0(101)
Ins[2] = ADD r3 r2 r1
我正在使用管道,我的dataPath是这样的:
我有5个阶段,有4个锁存缓冲区将它们分开。
问题是当ADD指令到达stage3(ALU应该计算r1 + r2)时,指令1(第二个LW)处于第4阶段并且还没有读取存储器的r0 + 101地址,所以我应该停止一个周期,然后Ins1到达最后一个阶段。
在这种情况下,第一个LW已完成其工作,并且r1的新值不在dataPath中的任何位置,但我需要将此值传递给ALU的输入B.
(这称为数据转发,因为当第三条指令处于第2阶段时,r1的值尚未准备就绪,我应该从后续阶段转发它(从最后一个MUX出来并转到ALU MUX的蓝线) ,但是由于第二个LW的失速,我还没有r1的值。
感谢您的帮助。
答案 0 :(得分:1)
在这种情况下,我应该停止管道。
因此,当Rtype处于stage2时,第二个LDM处于阶段3,第一个LDM处于阶段4,我检测到依赖关系并停止管道一个周期。
因此在下一个时钟中,Rtype仍处于stage2,stage4中的第二个LDM,第一个LDM正在写回寄存器,因此RType仍然处于stage2,它可以读取写入寄存器文件的数据。 (回写在时钟的最后完成。在posedge中,RType的第一个参数已准备就绪。)