关于MIPS中两条lw指令是否存在冒险及需插入停顿的问询
两条MIPS lw指令的冒险分析
先明确指令:
lw r2, 10(r1) lw r1, 10(r2)
你的判断是错误的,这两条指令之间存在RAW(写后读)数据冒险,是否需要插入停顿取决于CPU是否具备数据转发(旁路)机制。
具体原因:
- 第一条
lw r2, 10(r1)在MIPS经典5级流水线中,会在MEM阶段完成内存数据读取,直到WB阶段才会把新值写入寄存器r2。 - 第二条
lw r1, 10(r2)需要用r2存储的数值计算内存有效地址(即r2 + 10)。这条指令在ID阶段就要读取r2的值,而此时第一条指令还未完成r2的写回——寄存器堆里的r2还是旧值,并非第一条指令加载的新数据。
你提到的“第二条指令仅使用r2的地址而非其数值”是误解:10(r2)中的r2是基址寄存器,使用的是它存储的数值来计算内存地址,而非r2寄存器本身的硬件地址。
如果CPU没有数据转发机制,必须在两条指令之间插入1个停顿(nop指令),等待第一条指令完成WB阶段的写回;如果有转发机制,硬件会直接把第一条指令MEM阶段得到的r2新值转发给第二条指令的EX阶段,此时无需插入停顿。
内容的提问来源于stack exchange,提问作者mer mer
相关产品推荐
相关产品推荐

