我在mips指令中使用流水线操作感到困惑。任何帮助都会很棒。提前谢谢。
接下来的两个代码中的数据依赖性是什么?使用失速(气泡)或转发可以解决哪些问题。为方便起见,您可以使用形状1。
shape 1:
If-Id-Ex-Mem-Wb
解释:
if=instruction fetch
id=instruction decode register fetch
ex=execute
mem=memory access
wb=write back
代码1:
add $3,$4,$2
sub $5,$3,$1
lw $6,200($5)
sw $6,200($2)
lw $6,200($3)
add $7,$4,$6
代码2:
add $3,$4,$2
sub $5,$3,$1
lw $6,200($3)
add $7,$3,$6
(抱歉发帖不好,但我还不能发布图片)
感谢。
答案 0 :(得分:0)
让我们看看第一个:
add $3,$4,$2
sub $5,$3,$1
add
中使用sub
的结果,因此存在数据危险。我们必须插入一定数量的NOP阶段来解决它。假设所有指令占用5个周期,我们插入3个NOP,我们就完成了。
add $3,$4,$2 IF ID EX MEM WB
sub $5,$3,$1 NOP NOP NOP IF ID EX MEM WB
我们可以为所有后续指示执行此操作。现在,指令在EX和MEM阶段产生新值。在WB阶段之前,这些值不会写入寄存器(出于学习目的,我们假设这是真的)。由于寄存器是在ID阶段读取的,因此会留下一个三个周期的窗口,旧的错误值通过管道“流动”。在我们的案例中,转发可以帮助解决此问题 - 将结果从add:EX
转发到sub:ID
。
希望这有帮助。