我正在尝试了解时钟门控在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变为ON。
现在,在模拟期间,我看到一些情况,其中在周期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
中翻转in_val
,则posedge cycle 1
必须为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
。
答案 0 :(得分:1)
可能在门控时钟上出现毛刺,但未显示在波形上。您需要查看您正在使用的工具的用户手册,以了解如何记录和显示毛刺。它可能也有助于看到门控时钟的逻辑。是否使用NBA分配了clock_enable(&lt; =)?
答案 1 :(得分:1)
您对计时的理解似乎已经过时了。 in_val
没有计时(实际上,从片段中,我看不到它的来源)。可以随意更改(再次,从此片段的角度来看)。在gated_clock
变高的时候,in_val
此时some_val
的任何值都会被gated_clock
捕获,直到.myclass
变高为止再次(此时我们将采样一个新值)。
答案 2 :(得分:0)
基于新波形some_val
正确生成发布的RTL。在gated_clock
信号in_valid
和in_ready
的第一个边缘都是高电平,因此some_val
在该周期中也会变高。在下一个边缘,它会切换回低,因为in_valid
变低(并且btw in_val
也是如此)