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

问题描述

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

解决方法

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

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

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

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

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


相比之下,例如,在 classic RISC pipelines 中的通用寄存器的寄存器文件中,例如 MIPS、IIRC,构建它们是很常见的,因此写入发生在在前半部分-周期,读取发生在 ID 阶段的后半周期。 (因此回写可以“转发”以通过寄存器文件解码/获取,从而使旁路转发或危险的窗口比按其他顺序执行的时间更短。)

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


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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...