流水线
复制本地路径 | 在线编辑
流水线遇到的问题
1. 结构相关: 那就是指令和数据分离就好
2. 数据相关: 三种 -- RAW/WAW/WAR, 其中 MIPS 只可能出现 RAW
第一种: ALU 输出结果送到ALU输入上
-- add $s0,$t1,$t2
-- add $s1,$s0,$t2
第二种: 必须要暂停一次,然后MEM输出结果送到ALU输入上
-- lw $s0,8($t1)
-- add $s1,$s0,$t1
3. 控制相关
第一种: j 20 => (PC+4[31,28]||20||00)
-- 在IF阶段后增加一个判断电路,这样可以立刻更新PC,不需要暂停
第二种: jr $t1 => (PC=$t1)
-- 在ID阶段后增加一个判断电路,这样需要一个暂停周期
第三种: beq $s0,$s1,20 => (PC=PC+4+20<<2)
-- 在 ALU 阶段后增加一个判断电路,这样需要两个暂停周期
-- 但由于比较相等比较简单,在ID阶段增加一个异或电路,则可以只需暂停一个周期
PC 在流水线中的位置
IF
- 算出PC+4
ID
- 如果是 J 指令,那么就可以得出立即数,然后拼接,OK
- 如果是 JR 指令,那么同样可以得出寄存器数,即为新的 PC 值,OK
- 如果是 B 指令,已经把 PC+4+20<<2 这个值算了出来
ALU
- 得出是不是 B 指令,则可以进行判断是否选择 ID 中算出来的值