【发布时间】:2014-07-27 04:30:37
【问题描述】:
我在我的设计中对一些 锁存器 和逻辑进行时钟门控。我在合成和布局布线方面没有太多经验。在 RTL 中实现时钟门控的正确方法是什么?
示例 1:
always_comb begin
gated_clk = clk & latch_update_en;
end
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
示例 2: 在对 RTL 时钟门控的良好实践进行一些研究时,我偶然发现了一个 RTL 示例。该示例实现了上述代码,如下所示:
clock_gator cg_cell (.clk(clk), .en(latch_update_en), .scan_en(scan_en_in), .gated_clk(gated_clk));
always_latch begin
if(gated_clk) begin
latch_data <= new_data;
end
end
使用自定义时钟门控单元的目的是什么?如果 clk 在带有另一个使能信号的 always_comb 块中直接“与”-ed,那么该工具是否很难进行综合?我感觉使用特殊的时钟门控单元是生成门控时钟信号的标准方法。我试图理解为什么会这样。
【问题讨论】:
-
要使时钟正确选通,如果选通为高电平(假设高电平有效),寄存器必须仅在时钟上升沿接受新值。简单地将时钟和使能相结合是不够的,因为如果 clock 为高电平,这将在 gate 的上升沿产生虚假时钟。
-
我做了一些修改。我实际上并没有将时钟启用用于寄存器。我的设计中有一些闩锁。所以,这个想法是当latch_enable为高时在latch中捕获数据。所以,我用时钟与使能来创建半周期正时钟并使用它来捕获电平敏感(正)锁存器中的数据。
-
clock_gator不是标准的 Verilog 模块;它被您的代码拉到某个地方。如果你想让我们理解它,你必须向我们展示它是如何实现的。 -
我认为
clock_gator单元应该是一个无故障的实现。在您的示例 1 中,这是使用时钟门控的非常基本的想法。但是,它会产生故障并导致错误的行为。
标签: verilog system-verilog register-transfer-level vlsi