首页 > 解决方案 > 在 RTL 仿真中将生成的时钟定义为同步的

问题描述

我正在生成一个分频时钟,如下所示:

logic div_clk;
always_ff @(posedge clk or negedge rstb) begin 
   if(!rstb) div_clk <= 1'b0;
   else div_clk <= !div_clk;
end

然后我启动数据clk并在div_clk. 像这样的东西:

always_ff @(posedge clk) begin 
   clk_data <= something;
end

always_ff @(posedge div_clk) begin 
   div_clk_data <= clk_data;
end

在我的模拟中,我得到了一个竞争条件,因为clk_data更新同时发生div_clk并且div_clk_data得到了错误的值。

在综合中,我通过创建生成的时钟将这两个时钟定义为同步:

create_clock -name CLK [get_ports clk]
create_generated_clock -name GEN_DIV_CLK -source [get_ports clk] -divide_by 2 [get_pins div_clk]

是否有一些等效的东西可以放入我的 RTL 中,或者我可以做些什么来告诉我的模拟器div_clk同步clk并防止竞争条件发生?

标签: system-verilog

解决方案


这是不应使用 NBA 的情况。如果您希望时钟保持同步,则时钟树(包括门控时钟)中不应包含任何 NBA。


推荐阅读