此代码的发布时间太长,所以我只是描述它。我创造了一个几乎可以工作的5级mips管道。问题在于,到达指令解码阶段的每条指令都会在执行阶段覆盖控制信号值。不仅它导致PC跳过can指令,即从300 - >我只是需要知道在哪里寻找bug,因为这是一个类赋值。如果我们取出所有LW指令,CPU工作正常。
实施例: EX阶段的加法器将达到$ 4 $ 1 $ 2,应为1 一旦LW进入ID阶段,ALUsrc被断言并且ALUop从减去更改为添加 这迫使EX阶段的加法器增加$ 4 $ 1 $ 2,导致5存储在$ 4
中答案 0 :(得分:1)
http://en.wikipedia.org/wiki/File:MIPS_Architecture_%28Pipelined%29.svg
MIPS 5阶段管道(注释显示写入注册选择并启用)
管道阶段的底线表示寄存器文件写(后)端口地址和写使能,WB是内存中的数据。
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
加载Word指令 描述: 将一个字加载到指定地址的寄存器中。
操作:$ t = MEM [$ s + offset]; advance_pc(4);
语法:lw $ t,offset($ s)
编码: 1000 11ss ssst tttt iiii iiii iiii iiii
其中写入寄存器地址($ t)输入是从包含寄存器文件寄存器$ s偏移的数据存储器地址读取的,其中立即值i得到符号扩展。你的$ 4是$ t以上,$ 1或$ 2是$ s,而剩余的寄存器文件输出通道听起来是为了立即扩展的符号而被调整。
根据您的描述,您似乎没有使用三端口寄存器文件,其中一个端口是只写端口。
使用三端口寄存器文件时,只有在尝试从内存中使用新的寄存器文件值才能从内存中读取并写入寄存器文件之前,才会遇到冲突。这可以通过编程器调度NOOP来管理,直到未完成的寄存器文件写入在下一条指令尝试使用时退出,或者当输出包含对未完成的寄存器文件写入的引用时在硬件中停止IF / ID。
有三条指令可以传递到IF / ID的右侧,每条指令都有写入寄存器文件地址和写入启用。您需要将两个指令解码寄存器文件地址与这三个指令进行比较并停止IF / ID,直到清除它们为止。存储在这三个流水线级中的每一个中的写使能用于确定是否应该比较那些管道级中的写寄存器地址。
由于ID / EX,EX / MEM和MEM / WB写入寄存器文件地址未在其他任何地方使用,因此用于进行比较的电路可以与IF / ID和寄存器文件并置,从而防止不必要的布局延迟影响最小化时钟周期。
使用双端口寄存器文件要简单得多,并推断IF / ID停止,直到写入启用从MEM / WB返回,有效地将任何内存读取指令转换为3个周期指令(或更多,数据存储器可能会停止,如果它是缓存或缓慢)。出于性能原因,它会或多或少地生成三端口寄存器文件。当IF / ID停止时(对于存储器 - > regfile),有一个隐含的多路复用器来源MEM / WB级的两个寄存器文件端口控制(写使能,写地址)中的至少一个。
数据存储器访问可以使MEM / WB停止,就像指令存储器访问也可以停止IF / ID。停止的IF / ID不会向ID / EX发出寄存器文件的写使能,也不会使MEM / WB停止。