1

我对在 mips 指令中使用流水线感到困惑。任何帮助都会很棒。提前致谢。

接下来的两个代码中的数据依赖关系是什么?其中哪一个可以通过使用stall(bubble)或forwarding来解决。为方便起见,您可以使用形状 1。

          shape 1:

           If-Id-Ex-Mem-Wb

解释:

if=instruction fetch

id=instruction decode register fetch

ex=execute

mem=memory access

wb=write back 

代码1:

add $3,$4,$2

sub $5,$3,$1

lw  $6,200($5)

sw  $6,200($2)

lw  $6,200($3)

add $7,$4,$6

代码2:

add $3,$4,$2

sub $5,$3,$1

lw $6,200($3)

add $7,$3,$6

(对不起,糟糕的帖子,但我还不能发布图片)

谢谢。

4

1 回答 1

0

我们来看第一个:

add $3,$4,$2  

sub $5,$3,$1

的结果add用于sub,因此存在数据风险。我们必须插入一定数量的 NOP 阶段来解决它。假设所有指令占用 5 个周期,我们插入 3 个 NOP 就完成了。

add $3,$4,$2  IF  ID  EX MEM  WB  

sub $5,$3,$1     NOP NOP NOP  IF  ID  EX MEM  WB

我们可以为所有后续指令执行此操作。现在指令在 EX 和 MEM 阶段产生新值。这些值直到 WB 阶段才写入寄存器(出于学习目的,我们假设这是真的)。由于寄存器是在 ID 阶段读取的,因此会留下一个包含三个周期的窗口,其中旧的不正确值正在“流经”流水线。在我们上面的例子中,转发可以帮助解决这个问题——将结果从add:EXto转发sub:ID

希望这可以帮助。

于 2013-09-04T15:45:30.390 回答