Pipline 中的Hazard, Forwarding, Stall, Flush和其他

设计: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指令
上一篇:单相变频器生产方案,源码+ PDF原理图+ pcb


下一篇:Prometheus TSDB (Part 2): WAL and Checkpoint