设计:cmp和地址计算放在ID级
Flush和Stall
Flush产生的结果是:向上传递一条空指令,寄存器值被维持。
Stall产生的结果是:不向上传递指令,寄存器的值被维持。
对于A->B, 如果A Flush, 那么B得到了一条空指令,流水线在A级停顿,在B级继续。
如果A stall, 那么B的值也不会被更新,流水线在B级也停顿下来。
Hazard检测与解决
对于需要我们解决的Hazard一共有6种,解决方法如下:
冲突位置 | 冲突原因 | 解决方法 |
---|---|---|
ID和EXE | EXE级rd被ALU修改 | 使用EXE级ALU结果修改ID级寄存器 |
ID和EXE | EXE级rd被LW修改,此时ID不是SW | IF 级Stall, ID级Flush |
EXE和MEM | MEM级rd被LW修改,此时EXE是SW | MEM级读出的值修改EXE级寄存器 |
ID和MEM | MEM级rd被ALU修改 | 使用MEM级ALU结果修改ID级寄存器 |
ID和MEM | MEM级rd被LW修改 | 使用MEM级MEM结果修改ID级寄存器 |
IF | 跳转 | IF flush |
Forwarding
Forwarding 一共有4条路线
具体来说,ID级rs1和rs2的修正有3种选则:
- EXE级ALU的输出
- MEM级ALU的输出
- MEM级mem的输出
对于LW和SW的情况,有一种选择,
- 从MEM的输入口直接接到输入口。
(注意: 这种情况也满足EXE级是LW, ID级修改了reg的条件,因此stall时必须区分出ID是不是sw, 如果不是才stall)
信号含义解释
信号 | 含义 |
---|---|
RegWrite | 是否写寄存器,用来区别指令是否是LW或者ALU结果修改 |
DatatoReg/MemRead | 是否读mem,用来区别是否是lw指令 |