数据冒险的特定情况(当 R 型指令出现在两个连续的 LW 之后)

a specific case of data hazard( when a R-Type instruction comes after two consecutive LW )

我正在使用 Verilog 设计类似 MIPS 的 CPU,现在我正在处理数据风险。 我有这些说明:

Ins[0] = LW r1 r0(100)
Ins[1] = LW r2 r0(101)
Ins[2] = ADD r3 r2 r1

我正在使用管道,我的数据路径是这样的: 我有 5 个阶段,用 4 个锁存缓冲区将它们分开。

问题是当ADD指令到达stage3(ALU应该计算r1 + r2)时,指令1(第二个LW)在stage 4并且还没有读取内存的r0 + 101地址,所以我应该停止一个周期,然后 Ins1 到达最后一个阶段。

在这种情况下,第一个 LW 已完成其工作,并且 r1 的新值不在 dataPath 中的任何位置,但我需要将此值传递给 ALU 的输入 B。

(这称为数据转发,因为当第三条指令在第 2 阶段时,r1 的值尚未准备好,我应该从后面的阶段转发它(从最后一个 MUX 出来并转到 ALU 的蓝色线MUXs),但由于第二个 LW 的停顿,我没有进一步的 r1 的值。

感谢您的帮助。

我错了。我的错误是,当 LDM 指令后跟 RType 时,当 Rtype 处于 stage3 而 LDM 处于 stage4 时,我会停止处理器。但是相反,当 RType 处于 stage2(解码)并且 LDM 处于 stage3(exec)时,我应该在此之前检测依赖关系。

在这种情况下,我应该停止管道。

因此,当 Rtype 处于第 2 阶段,第二个 LDM 处于第 3 阶段,第一个 LDM 处于第 4 阶段时,我检测到依赖关系并停止流水线一个周期。

所以在下一个时钟,Rtype还在stage2,第二个LDM在stage4,第一个LDM正在回写寄存器,因此因为RType还在stage2,它可以读取写入寄存器文件的数据。 (回写在时钟的下降沿完成。在 posedge 中,RType 的第一个参数准备就绪。)