我们为什么要将NPC存储在流水线寄存器中?

时间:2013-07-31 03:52:03

标签: fetch pipeline

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

我知道我们应该在获取阶段将mem[pc]存储到IF/ID流水线寄存器中,以便我们在下一阶段对其进行解码,我们也应该在获取阶段更新PC因为我们将会通过更新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

2 个答案:

答案 0 :(得分:3)

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

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

另一种分支是“相对”分支,其中分支目标不是绝对地址而是偏移,即“分支前向X指令”。 (如果X为负数,则最终成为向后分支。)现在考虑这个:向前/向后从哪里?来自NPC。也就是说,对于相对分支指令,新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!

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

答案 1 :(得分:0)

如果异常点位于分支延迟槽中,则需要两台PC重新启动执行:一台 指向异常指令(延迟槽),另一指针指向下一条指令。该 因为延迟时隙之后的指令可能是下一个,所以需要第二台PC 顺序指令(如果未采用分支)或分支目标(如果采用分支)。 虽然MIPS具有相同的问题,但它依赖于软件来支持前一个异常点 重启执行前的指令(当它是分支时);这是有效的,因为分支是 幂等的。

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