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

时间:2019-01-09 20:47:32

标签: system-verilog

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

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_datadiv_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同步并防止发生竞争情况?

1 个答案:

答案 0 :(得分:3)

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