我需要多少个档位才能正确执行以下指令。我对自己的所作所为感到有些困惑,因此我在这里看到专家的答案。
lw $1,0($2);
beq $1,$2,Label;
注意,将在解码阶段检查分支是否会发生。但是在这种情况下,beq的源寄存器rs是$ 1,它将在lw指令的写回阶段之后更新。因此,我们是否需要将新数据从内存阶段的内存转发到beq指令的解码阶段。
登台是这样的:
IF:指令获取;
ID:指令解码
例如:执行/ALU阶段
MEM:从内存中读取数据
WB:将数据存储在目标寄存器中
到目前为止,这是我所做的。
当lw处于执行阶段,而beq处于解码阶段时,停顿条件变为真并创建了气泡。现在lw处于Mem阶段,由于气泡而beq仍处于解码阶段,再次停滞条件变为真并发生了第二个停顿。现在lw处于WB(回写)并且beq处于解码阶段但该值仍然是$ 1将在WB阶段结束时更新,这最终意味着beq仍将使用$ 1的错误值工作。
最佳答案
看起来您将需要第三个停顿,以便在解码之前将寄存器写回到寄存器文件,或将数据从写回阶段转发到解码阶段。无论哪种方式,如果要写入的寄存器等于rs
,都应执行此操作。
您似乎需要过多的停顿,因为在解码阶段的早期就检测到了分支,这很好,因为它节省了获取不必要的指令的需求,这些指令无论如何都会被刷新,但是您必须对此进行适当的危害检测。
关于assembly - 组装中的流水线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14093201/