在 RTL 仿真中将生成的时钟定义为同步时钟

Defining generated clock as synchronous in RTL simulation

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

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_clkclk 同步并防止竞争条件发生?

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