代码之家  ›  专栏  ›  技术社区  ›  Kamran Hosseini

数据危险的一种特殊情况(当r型指令在两个连续lw之后出现时)

  •  2
  • Kamran Hosseini  · 技术社区  · 8 年前

    我正在用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的值。

    谢谢你的帮助。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Kamran Hosseini    7 年前

    我犯了个错误。我的错误是,当ldm指令后跟rtype时,当rtype在第3阶段,ldm在第4阶段时,我会暂停处理器。但是,我应该在一个时钟之前检测依赖关系,当rtype在stage2(decode)中,ldm在stage3(exec)中时。

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

    因此,当rtype在第2阶段,第二ldm在第3阶段,第一ldm在第4阶段时,我检测依赖关系并暂停管道一个周期。

    所以在下一个时钟中,rtype仍然在第二阶段,第二个ldm在第四阶段,第一个ldm正在写回寄存器,因此由于rtype仍然在第二阶段,它可以读取写入寄存器文件的数据。(回写在时钟的负边缘完成。在posedge中,rtype的第一个参数已就绪。)

    推荐文章