6

我需要多少档位才能正确执行以下指令。我对自己的所作所为有点困惑,所以我在这里看专家的答案。

lw $1,0($2);

beq $1,$2,Label;

请注意,是否会发生分支的检查将在解码阶段完成。但是在这种情况下为 $1 的 beq 的源寄存器 rs 将在 lw 指令的回写阶段之后更新。那么我们是否需要将内存阶段的内存中的新数据转发到beq指令的解码阶段。

舞台是这样的:

在此处输入图像描述

IF:取指令;ID:指令解码 Ex:执行/ALU 阶段 MEM:从内存中读取数据 WB:将数据存储在目标寄存器中

这是我到目前为止所做的。

当 lw 处于 exec 阶段而 beq 处于解码阶段时,停顿条件变为真并创建了一个气泡。现在 lw 处于 Mem 阶段,并且由于气泡,beq 仍处于解码阶段,再次停止条件已变为真,并且发生了第二次停止。现在 lw 处于 WB(回写)并且 beq 处于解码阶段,但仍然是值1 美元的值将在 WB 阶段结束时更新,这最终意味着 beq 仍然可以使用错误的 1 美元值。

4

1 回答 1

2

看起来您需要第三次停顿以允许在解码之前将寄存器写回寄存器文件,或者将数据从写回阶段转发到解码阶段。无论哪种方式,如果要写入的寄存器等于 ,则应该执行此操作rs

您似乎需要太多的停顿,因为在解码阶段的早期检测到分支,这很好,因为它节省了获取无论如何都会被刷新的不必要的指令,但是您必须进行适当的危险检测才能进行。

于 2012-12-30T18:47:44.440 回答