【发布时间】:2016-08-23 23:11:53
【问题描述】:
我试图了解时钟门控在 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 是如何在这里采样的呢?据我了解,如果我们想在 cycle 1 中击败 in_val,那么 posedge gated_clock 必须为 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 已关闭。
【问题讨论】:
-
你能分享
gated_clock代的代码sn-p吗? -
in_val、in_valid、in_ready和some_val的波形以及gated_clock的时钟会有所帮助(以及您希望看到的波形)。
标签: verilog system-verilog digital-logic register-transfer-level vlsi