关于带停顿与全转发的5段流水线时钟图正确性的技术问询
MIPS全转发流水线停顿分析
指令序列
1. lw $s2,0($s1) 2. lw $s1,40($s6) 3. sub $s6,$s1,$s2 4. add $s6,$s2,$s2 5. or $s3,$s6,$zero 6. sw $s6,60($s1)
数据冒险与转发可行性分析
针对第3条sub指令的数据冒险:
- 源操作数
$s2来自第1条lw指令:第1条lw的WB阶段在时钟周期4(CC4),通过WB→Exe转发路径,可以将$s2的值直接传递给sub的EX阶段,无需额外等待。 - 源操作数
$s1来自第2条lw指令:第2条lw的MEM阶段在CC4,你的流水线支持Mem→Exe转发,可以将MEM阶段生成的$s1值直接传递给sub的EX阶段。
停顿必要性判断
sub指令在CC3进入ID阶段时,需要读取寄存器$s1,但此时第2条lw刚进入EX阶段(CC3),$s1的值还未生成到可转发的阶段(MEM要到CC4),因此必须插入1个停顿(NOP),让sub的EX阶段推迟到CC5——此时第2条lw处于MEM阶段,刚好可以通过Mem→Exe转发给sub的EX阶段。
你只插入1个停顿的做法是完全正确的。那些插入2个停顿的示例,通常是流水线不支持Mem→Exe转发的场景:此时$s1要等到第2条lw的WB阶段(CC5)才能转发,sub的EX阶段要推迟到CC6,因此需要2个停顿。而你的场景是全转发架构,1个停顿就足够解决数据冒险。
内容的提问来源于stack exchange,提问作者Yesk
相关产品推荐
相关产品推荐

