何时在MIPS管道中存储数据以注册加载指令

何时在MIPS管道中存储数据以注册加载指令,mips,computer-architecture,Mips,Computer Architecture,我了解到,在MIPS管道中,对于加载指令,数据是在指令的第四阶段(即内存访问阶段)从缓存中读取的。对于其他指令(除加载/存储外),该阶段负责将结果寄存器中的数据写入回写寄存器,然后在下一阶段,将其回写到寄存器文件。但在从缓存读取后加载指令的情况下,数据何时写入目标寄存器?是在第四阶段本身还是在第五阶段。如果在第5阶段执行此操作,是先写入回写寄存器,还是直接写入寄存器文件?因此,假设您讨论的是标准的5阶段MIPS管道,load指令将在写回阶段结束时与任何其他指令同时写入目标寄存器。因此,如果我们看

我了解到,在MIPS管道中,对于加载指令,数据是在指令的第四阶段(即内存访问阶段)从缓存中读取的。对于其他指令(除加载/存储外),该阶段负责将结果寄存器中的数据写入回写寄存器,然后在下一阶段,将其回写到寄存器文件。但在从缓存读取后加载指令的情况下,数据何时写入目标寄存器?是在第四阶段本身还是在第五阶段。如果在第5阶段执行此操作,是先写入回写寄存器,还是直接写入寄存器文件?

因此,假设您讨论的是标准的5阶段MIPS管道,load指令将在写回阶段结束时与任何其他指令同时写入目标寄存器。因此,如果我们看下面的例子:

假设管道中没有数据转发(或绕过),加载的数据仅在写回后的周期内可用。如果您在注册文件周围进行了转发,它将如下所示:

如您所见,在循环4中,数据已经加载并位于Mem和Wb阶段之间的管道寄存器中,它被绕过回到解码阶段,同时写入寄存器文件和解码和执行阶段之间的管道寄存器

通过超级积极的旁路,您甚至可以提前一个周期获得数据


但在所有这些示例中,LD指令仍在写回阶段结束时写入目标寄存器R1。

因此,假设您讨论的是标准的5级MIPS管道,load指令将在写回阶段结束时与任何其他指令同时写入目标寄存器。因此,如果我们看下面的例子:

假设管道中没有数据转发(或绕过),加载的数据仅在写回后的周期内可用。如果您在注册文件周围进行了转发,它将如下所示:

如您所见,在循环4中,数据已经加载并位于Mem和Wb阶段之间的管道寄存器中,它被绕过回到解码阶段,同时写入寄存器文件和解码和执行阶段之间的管道寄存器

通过超级积极的旁路,您甚至可以提前一个周期获得数据


但在所有这些示例中,LD指令仍在写回阶段结束时写入目标寄存器R1。

对于加载指令,例如
lw
在写回阶段将值写入寄存器。结果总是在写回阶段写回寄存器。对于加载指令,例如
lw
,值在写回阶段写入寄存器。结果总是在写回阶段写回寄存器;它在写回期间的前半个周期写入寄存器文件,并在解码的后半个周期从寄存器文件读取(中的表2.7。这不仅消除了转发周期,而且允许寄存器文件没有专用的写入端口。)MIPS R2000在具有加载延迟槽方面也有点奇怪。加载后立即执行的指令不会暂停,以等待加载值变为可用(微处理器无联锁管道级)。在缓存命中时,将从寄存器文件读取旧值,但在缓存未命中(或加载后立即出现异常)时,将读取加载指令返回的值。如果无法插入独立指令,则将使用nop(如分支延迟槽)。注意在两个不同阶段写入寄存器文件可能会带来结构性危险,因为两条指令可能同时尝试写入寄存器文件。原始MIPS(R2000)使用了某种巧妙的技巧来减少寄存器文件中值可用性的延迟;它在写回期间的前半个周期写入寄存器文件,并在解码的后半个周期从寄存器文件读取(表2.7 in.不仅消除了一个转发周期,而且允许寄存器文件没有专用的写入端口。)MIPS R2000在具有加载延迟槽方面也有点奇怪。加载后立即执行的指令不会暂停以等待加载值变为可用(没有互锁管道级的微处理器)。在缓存命中时,将从寄存器文件读取较旧的值,但在缓存未命中(或加载后立即出现异常)时,将读取加载指令返回的值。如果无法插入独立指令,则将使用nop(如分支延迟槽)。请注意,在两个不同阶段写入寄存器文件可能会带来结构性危险,因为两条指令可能会同时尝试写入寄存器文件。
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