如果同时读写PC寄存器,那么读取的数据是之前的数据还是新写入的数据?

If the PC register is simultaneously read and written, does its read data contain the previous data or the newly-written data?

如果同时读写PC寄存器,它读取的数据是之前的数据还是新写入的数据?根据我对时序电路的理解,由于传播延迟,写入命令的效果不会立即在 PC 寄存器中生效,因此,在时钟的上升沿,读取命令将获得旧值。但我的问题的推论是,如果是这种情况,读取命令不应该在某种意义上也有延迟并且可能读取新写入的数据吗?

程序计数器通常非常特殊,不会与其他寄存器一起成为寄存器文件的一部分。您没有“读取命令”,它的输出总是连接到其他部分,在适当的时候读取它。 (即当它的输出稳定并且具有您想要的值时)。例如查看 MIPS 流水线或非流水线单周期或多周期设计的各种框图。

我认为您通常会用边沿触发的触发器构建这样的物理寄存器。 (https://en.wikipedia.org/wiki/Flip-flop_(electronics))。请注意,D 触发器 确实 将先前的输入锁存为时钟边沿上的当前输出,并且 然后 输入允许在之后更改那。

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

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

那篇 wiki 文章还提到了 master-slave edge-triggered D Flip-Flop 链接 2 gated (not clocked) D latches with an inverted clock, so capturing the input发生在与先前捕获的数据更新输出相反的时钟边沿。


通过比较,例如,在 classic RISC pipelines 中的通用寄存器的寄存器文件中 ,例如 MIPS、IIRC,构建它们很常见,因此会发生写入 在前半个周期,读取发生在 ID 阶段的后半个周期。 (因此回写可以通过寄存器文件“转发”到 decode/fetch,从而使绕过转发或危险的 window 比按其他顺序执行时更短。)

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


总的来说,就看你怎么设计了!

如果你想要相同的时钟边沿更新寄存器的输入,同时将旧值锁存到输出,你的主从触发器会做到这一点(将旧输入捕获到内部状态,并将旧内部状态锁存到输出上)。

或者您可以将其设计为在时钟边沿捕获输入,并在几个门延迟后传播到输出,并在该时钟周期(或半周期)的剩余时间保持锁存。那将是一个 D 触发器(每位)。