我试图了解时钟门控在 RTL 设计中是如何工作的。
我在这里有一个示例波:
描述:
1st signal is gated_clock
2nd signal is clock_enable
3rd signal is ungated_clock
所以这个波中有 3 个周期(比如说周期 0,1,2)。在第 0 周期,clock_enable 为低电平,gated_clock 关闭。在周期 1 中,clock_enable 变为高电平,在下一个周期(周期 2)中,gated_clock 开启。
现在,在模拟过程中,我看到了一些情况,其中在周期 1 接收到的传入数据被正确注册到由时钟门控的模块中(使用gated_clock)。这对我来说有点奇怪,我不太明白这怎么可能。
逻辑是这样的:
always_ff @(posedge gated_clock, negedge reset) begin
if (~reset) begin
some_val <= 1'b0;
end else begin
if (in_valid==1'b1 && in_ready==1'b1) begin
some_val <= in_val;
end else begin
some_val <= 1'b0;
end
end
end
所以我看到如果in_valid
和in_ready
高cycle 1
那么some_val
将注册传入的in_val
数据,它将在cycle 2
. 然而,在 中cycle 1
,gated_clock
为零。那么 in_val 是如何在这里采样的呢?据我了解,gated_clock
如果我们想要 flopin_val
的话,posedge 必须是 1 cycle 1
。
我可能会遗漏一些核心电路级数字设计概念。我真的很感激任何帮助。
1st signal is gated_clock
2nd signal is clock_enable
3rd signal is ungated_clock
4th signal is in_valid
5th signal is in_ready
6th signal is in_val
7th signal is some_val
所以在这里你会看到cycle 0
,gated_clock
关闭但in_val
很高in_ready
。输入数据in_val
也很高。在下一个周期some_val
变高。因此,即使关闭,它看起来也像是in_val
被捕获了。cycle 0
gated_clock