0

我试图了解时钟门控在 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_validin_readycycle 1那么some_val将注册传入的in_val数据,它将在cycle 2. 然而,在 中cycle 1gated_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 0gated_clock

4

3 回答 3

1

你对时钟的理解似乎不对 in_val这里没有计时(实际上,从片段中,我看不出它来自哪里)。可以随意更改(同样,从这个片段的角度来看)。在变高的那一点,现​​在将捕获gated_clock当时的任何值,并且这将一直可用,直到再次变高(此时我们将采样一个新值)。in_valsome_valgated_clock

于 2016-08-24T05:27:57.707 回答
1

门控时钟上可能存在未显示在波形上的故障。您需要查看您正在使用的工具的用户手册,以了解如何记录和显示故障。它也可能有助于查看门控时钟的逻辑。是否使用 NBA (<=) 分配了clock_enable?

于 2016-08-23T23:57:21.027 回答
0

根据新波形some_val正确生成到发布的 RTL。在gated_clock信号的第一个边沿in_validin_ready两者都为高电平,因此some_val在该周期中也会变高。在下一个边缘它切换回低,因为in_valid变低(顺便说一句in_val

于 2016-08-24T18:58:49.010 回答