【问题标题】:Pipelining in assembly装配流水线
【发布时间】:2012-12-15 02:48:53
【问题描述】:

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

lw $1,0($2);

beq $1,$2,Label;

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

舞台是这样的:

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

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

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

【问题讨论】:

  • “检查分支是否会发生” - 你的意思是哪个检查。根据csc.gatech.edu/~copeland/3055-00/lab/lab-2/MIPS_pipes.JPEG 分支在EX中完成;并且新的 PC 被转发到 MEM 的 PC 寄存器。
  • 由于分支延迟,您需要额外增加 1 个档位。所以你需要 7 个摊位。
  • 怎么变成7档了??最多可以2个摊位

标签: assembly mips


【解决方案1】:

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

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

【讨论】:

  • 好的。那就是我所想的。我和我的教授发生了争执,他说我只需要两个摊位,上面的案例不需要回信。这就是我困惑的原因
  • @Alfred 你的教授可能假设寄存器文件是异步的,它将在下一个时钟之前更新,但这可能不是你正在使用或想要使用的内存类型。
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2014-04-04
  • 2022-07-14
  • 2015-05-07
  • 2011-01-26
  • 2017-02-24
  • 2017-03-24
  • 2011-03-18
相关资源
最近更新 更多