如果同时读取和写入PC寄存器,其读取数据是否包含以前的数据或新写入的数据



如果同时读取和写入PC寄存器,其读取数据是否包含以前的数据或新写入的数据?根据我对时序电路的理解,由于传播延迟,写入命令的效果不会立即在PC寄存器中生效,因此,在时钟的上升沿,读取命令将获得旧值。但我的问题的必然结果是,如果是这样的话,read命令不应该在某种意义上也有延迟,并且可能读取新写入的数据吗?

程序计数器通常足够特殊,它与其他寄存器不属于寄存器文件。你没有一个";读取命令";,它的输出总是连接到其他部分,这些部分在适当的时候读取它。(即当它的输出稳定并且具有您想要的值时(。例如参见MIPS流水线的各种框图、或者非流水线单循环或多循环设计。

我想,你通常会用边缘触发的触发器来构建这样一个物理寄存器。(https://en.wikipedia.org/wiki/Flip-flop_(电子((。请注意,D触发器确实在时钟沿上将前一个输入锁存为当前输出,然后允许输入在这之后发生变化。

在时钟边缘之前有一个定时窗口,输入必须保持稳定,之后可以开始改变几个门延迟。请注意,通过将所有具有相同时钟信号的D触发器链接而构建的移位寄存器的示例。

如果在值开始更改之前安排捕获值时遇到问题,你可以设计一些有意的时钟偏斜,这样触发器在你触发提供输入的东西来改变它之前就可以可靠地锁存它的输入。(但通常情况下,无论你触发什么,在它的输出真正改变之前,它本身都会有至少几个门延迟,因此移位寄存器是由链式D触发器组成的。(

该wiki文章还提到了主从边缘触发的D触发器,该触发器用反相时钟链接2个门控(非时钟(D锁存器,因此捕获输入发生在与用先前捕获的数据更新输出相反的时钟边缘。


通过比较,例如,在MIPS、IIRC等经典RISC流水线中的通用寄存器的寄存器文件中,通常会构建它们,因此写入发生在ID阶段的前半周期,读取发生在ID的后半周期。(因此,回写可以"转发"通过寄存器文件进行解码/获取,使绕过转发或危险的窗口比按其他顺序进行时更短。(

这意味着写数据在你需要读取之前有机会稳定下来


总的来说,这取决于你如何设计它

如果您希望相同的时钟边沿用输入更新寄存器,同时将旧值锁存到输出,则主从触发器将执行此操作(将旧输入捕获到内部状态,并将旧内部状态锁存到输入(。

或者,您可以将其设计为在时钟边缘捕获输入,并在几个门延迟后传播到输出,并在该时钟周期(或半周期(的剩余时间内保持锁存状态。这将是单个D触发器(每个比特(。

最新更新