我了解到,在MIPS管道中,对于加载指令,数据是在指令的第四阶段从缓存中读取的,这是内存访问阶段。在其他指令(除了加载/存储)的情况下,该阶段负责将结果寄存器中的数据写入回写寄存器,然后在下一阶段将其写回寄存器堆。但在从缓存读取后加载指令的情况下,何时将数据写入目标寄存器是在第四阶段还是在第五阶段。如果这是在第五阶段完成的,它是先写入回写寄存器,还是直接写入寄存器堆?
因此,假设您谈论的是标准的5阶段MIPS管道,则加载指令会在写回阶段结束时与任何其他指令同时写入目标寄存器。因此,如果我们看下面的例子:
cycle 0 1 2 3 4 5 6 7 8 LD R1, [MEM] F | D | X | M | WB | ADDi R1, R1, #5 | F | D | D | D | D | X | M | WB
假设管道中没有数据转发(或绕过),则加载的数据将仅在写回后的周期内可用。如果你在注册文件周围转发,它会看起来像这样:
cycle 0 1 2 3 4 5 6 7 LD R1, [MEM] F | D | X | M | WB | ADDi R1, R1, #5 | F | D | D | D | X | M | WB
如您所见,在周期4中,数据已经加载并位于Mem和Wb阶段之间的流水线寄存器中,它被旁路回Decode阶段,并同时写入寄存器堆和Decode和eExute阶段之间的管线寄存器中。
通过超级激进的绕过,您甚至可以提前一个周期获得数据。
但在所有这些示例中,LD指令在写回阶段结束时仍在写入目标寄存器R1。