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

标签 assembly mips pipeline cpu-architecture cpu-hazard

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

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

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

问题是,当ADD指令到达阶段3(ALU应该计算r1 + r2)时,指令1(第二个LW)处于阶段4并且尚未读取内存的r0 + 101地址,因此我应该停止一个周期,然后 Ins1 到达最后阶段。

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

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

感谢您的帮助。

最佳答案

我犯了一个错误。我的错误是,当 LDM 指令后面跟着 RType 时,当 Rtype 处于 stage3 并且 LDM 处于 stage4 时,我会停止处理器。相反,当 RType 处于 stage2(解码)且 LDM 处于 stage3(执行)时,我应该在此之前一个时钟检测依赖性。

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

因此,当 Rtype 处于阶段 2、第二个 LDM 处于阶段 3、第一个 LDM 处于阶段 4 时,我检测到依赖性并停止管道一个周期。

因此在下一个时钟中,Rtype 仍处于 stage2,第二个 LDM 处于 stage4,第一个 LDM 正在写回寄存器,因此由于 RType 仍处于 stage2,因此它可以读取写入寄存器文件的数据。 (写回在时钟的负边完成。在posege中,RType的第一个参数已准备好。)

关于assembly - 数据危险的特定情况(当 R 类型指令出现在两个连续的 LW 之后时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50722307/

相关文章:

mips - RISC 的 SPIM 与 MARS

opengl - 为什么在顶点着色器之后处理几何着色器?

assembly - 为什么我有PUSH ecx?

C 中的调用堆栈回溯

assembly - 数据中来自 .asciiz 的 MIPS lw

azure - 如果任务中报告任何错误,如何使 Azure 管道失败

c - 新手 asm : where is the call code?

assembly - 非常大的地址复制为负值

c++ - 设置进位标志的最快方法