汇编语言中的流水线技术

7

我需要多少个摊位才能正确执行以下指令。我有些困惑于我的操作,所以来这里寻求专家的答案。

lw $1,0($2);

beq $1,$2,Label;

请注意,判断分支是否发生的检查将在解码阶段进行。但是,beq指令的源寄存器rs(在本例中为$1)将在lw指令的写回阶段更新。因此,我们需要将内存阶段的新数据转发到beq指令的解码阶段吗?
阶段如下:
IF:指令获取; ID:指令解码 Ex:执行/ALU阶段 MEM:从内存读取数据 WB:将数据存储在目标寄存器中
这是我迄今为止所做的。
当lw处于执行阶段而beq处于解码阶段时,停顿条件变为真,并创建了一个气泡。现在,lw处于Mem阶段,而由于气泡,beq仍处于解码阶段,再次出现了停顿条件,第二个停顿已经发生。现在,lw处于WB(写回)阶段,而beq仍处于解码阶段,但$1的值仍将在WB阶段末更新,这最终意味着beq仍将使用错误的$1值。

“检查分支是否会发生” - 你指的是哪个检查?根据http://www.csc.gatech.edu/~copeland/3055-00/lab/lab-2/MIPS_pipes.JPEG,分支在EX中完成;新的PC被转发到MEM中的PC寄存器。 - osgx
由于延迟分支,您需要增加1个额外的档位。因此,您将需要7个档位。 - Blood
它怎么会变成7个车位??最多只能有2个车位。 - Alfred
1个回答

2

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

似乎你需要太多的停顿,因为分支早在解码阶段就被检测到了,这是好事,因为它节省了获取不必要指令的时间,这些指令最终会被清除,但是你必须有适当的危险检测来配合。


好的,我明白了。我和我的教授有过争论,他说在上述情况下只需要两个拦车位而不需要写回。这就是我感到困惑的原因。 - Alfred
@Alfred,你的教授可能假设寄存器文件是异步的,并且在下一个时钟之前会更新,但这可能不是你正在使用或想要使用的内存类型。 - iabdalkader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接