流水线装配

Alf*_*red 6 assembly mips

我需要多少档才能正确执行以下说明.我对自己的所作所为感到困惑,所以我在这里看到专家的答案.

lw $1,0($2);

beq $1,$2,Label;
Run Code Online (Sandbox Code Playgroud)

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

舞台是这样的:

在此输入图像描述

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

这就是我到目前为止所做的.

当lw处于exec阶段并且beq处于解码阶段时,停止条件变为真并且产生气泡.现在lw处于Mem阶段,beq仍处于解码阶段,由于气泡,停止状态再次变为真,第二档已经发生.现在lw处于WB(写回)并且beq处于解码阶段但仍然是值1美元将在WB阶段结束时更新,这最终意味着beq仍将使用错误的$ 1值.

iab*_*der 2

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

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