RTL设计中的时钟门控如何工作?

时间:2016-08-23 23:11:53

标签: verilog system-verilog digital-logic register-transfer-level vlsi

我正在尝试了解时钟门控在RTL设计中的工作原理。

我在这里有一个例子:

enter image description here

说明

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_validin_readycycle 1中很高,那么some_val将注册传入的in_val数据,它将是可在cycle 2中找到。但是在cycle 1中,gated_clock为零。那么in_val是如何在这里得到的?根据我的理解,如果我们想在gated_clock中翻转in_val,则posedge cycle 1必须为1。

我可能会错过一些核心电路级数字设计概念。我真的会提供任何帮助。

更新wave: enter image description here

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 0gated_clock已关闭但in_valin_ready很高。输入数据in_val也很高。在下一个周期some_val变高。因此,即使in_val已关闭,cycle 0中也会显示gated_clock

3 个答案:

答案 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_validin_ready的第一个边缘都是高电平,因此some_val在该周期中也会变高。在下一个边缘,它会切换回低,因为in_valid变低(并且btw in_val也是如此)