MIPS管道暂停:LW后的SW

MIPS管道暂停:LW后的SW,mips,pipeline,cpu-architecture,forwarding,Mips,Pipeline,Cpu Architecture,Forwarding,我很困惑,在使用相同$rt的LW之后出现的存储字指令如何导致MIPS中的管道暂停。 考虑这个代码块: lw $s0, 0($t0) sw $s0, 12($t0) lw $s1, 4($t0) sw $s1, 16($t0) lw $s2, 8($t0) sw $s2, 20($t0) 这里有三个单词在记忆中被移动。例如,在前两行中,$s0加载到, 然后它的内容被保存回内存中。我不确定sw指令在EX阶段还是在MEM阶段需要$s0。如果在MEM阶段需要它,不需要暂停

我很困惑,在使用相同$rt的LW之后出现的存储字指令如何导致MIPS中的管道暂停。 考虑这个代码块:

  lw $s0,  0($t0)
  sw $s0, 12($t0)
  lw $s1,  4($t0)
  sw $s1, 16($t0)
  lw $s2,  8($t0)
  sw $s2, 20($t0)
这里有三个单词在记忆中被移动。例如,在前两行中,$s0加载到,
然后它的内容被保存回内存中。我不确定sw指令在EX阶段还是在MEM阶段需要$s0。如果在MEM阶段需要它,不需要暂停管道就可以通过转发来解决吗?

假设是的。直接转发到MEM阶段可以背对背地执行从属的
LW
SW
。只要加载的字至少由
SW
存储。在没有管道气泡的情况下,
SW
不可能使用加载的字作为地址的基,否则它将需要及时转发

但通常情况下,您会看到如下管道(来源:SIM-PL中5级流水线MIPS的模型),只有一个转发器馈送到EX。在这样的设置下,无法从
LW
转发到
SW
,它所需的硬件不存在


好的,明白了。因此,从理论上讲,如果你想通过转发解决这个问题,你需要在管道的MEM阶段添加多路复用器和额外的转发单元?@WaqasAhmad yes exactlyRight,谢谢!最后一个问题是:这是否与前转运单位类似?当然,来自管道寄存器的输入会相应地改变,但基本架构将包含来自管道寄存器的输入和mem阶段某处的mux?@WaqasAhmad这将是类似的,但实际上要简单得多,因为只有一个地方可以从(WB)转发,而不是两个。这是真的!twi alu输入不需要两个mux!正如harold所指出的,您可以构建硬件,从MEM->MEM转发数据,但通常很容易避免编写如此低效的代码。MIPS有许多寄存器,这使得通过软件管道将加载操作简化,例如,先进行所有3次加载,然后进行所有3次存储。在MIPS I(R2000)上,loads有一个延迟槽,在该槽中,在下一条指令中使用结果是不安全的,因为管道甚至没有检查这种危险。使用ALU指令加载的数据比使用存储更为常见。@PeterCordes是的,我明白了。我在娱乐一个假设场景,这是评估的一部分。执行所有加载然后保存是最简单的解决方法当然,我只是指出了为什么在真正的硬件上花费晶体管是不值得的,即使这是可能的。是的,绝对值得。