1

我只谈pipeline了几个小时的理论。也许这是一个简单的问题,但我真的需要你的帮助。

我知道我们应该在 fetch 阶段存储mem[pc]IF/ID管道寄存器中,因为我们将在下一阶段对其进行解码,我们也应该PC在 fetch 阶段更新,因为我们将通过更新的下一个周期获取下一条指令PC,但我真的不明白为什么我们应该还将NPC存储到管道寄存器中。

以下是来自的解释Computer Organization and Design,我不明白。

This incremented address is also saved in the IF/ID pipeline register in case it is needed later for an instruction, such as beq

4

2 回答 2

3

将NPC保存在管道中的原因是因为有时管道中的下一条指令会想要使用它。

看看 的定义beq。它必须计算分支的目标地址。一些分支使用固定位置作为目标地址,例如“分支到地址 A”。这称为“分支到绝对地址”。

另一种分支是“相对”分支,其中分支目标不是绝对地址而是偏移量,即“向前分支X指令”。(如果 X 是负数,这最终是一个向后分支。)现在考虑这个:从哪里向前/向后?来自全国人大。也就是说,对于相对分支指令,新 PC 值的计算为:

NewPC = NPC + X

为什么架构包括执行相关分支的能力?因为它占用的空间更少。假设 X 有一个很小的值,比如 16。绝对分支到目标地址所需的存储空间是:

sizeof(branch opcode) + sizeof(address)

但是偏移量 16 的相对分支的存储只是:

sizeof(branch opcode) + 1     ## number of bytes needed to hold the value 16!

当然,可以通过增加用于保存偏移值的字节数来适应更大的偏移量。其他类型的节省空间、增加范围的表示也是可能的。

于 2013-07-31T04:19:30.740 回答
0

如果异常点位于分支延迟槽中,则需要两台 PC 重新开始执行:一台指向异常指令(延迟槽),另一台指向下一条指令。需要第二台 PC,因为延迟槽之后的指令可能是下一个顺序指令(如果未采用分支)或分支目标(如果采用分支)。虽然 MIPS 也有同样的问题,但它依赖于软件在重新开始执行之前将异常点备份到上一条指令(当它是分支时);这是有效的,因为分支是幂等的。

学分:http ://www.cs.berkeley.edu/~kubitron/courses/cs252-S09/handouts/oldquiz/sp09-quiz1_soln.pdf

于 2016-04-08T04:11:30.523 回答