在 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_clk
与 clk
同步并防止竞争条件发生?
这是不应该使用 NBA 的情况。如果您希望时钟保持同步,则您的时钟树(包括门控时钟)中不应该有任何 NBA。
我正在生成分频时钟,如下所示:
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
同步并防止竞争条件发生?
这是不应该使用 NBA 的情况。如果您希望时钟保持同步,则您的时钟树(包括门控时钟)中不应该有任何 NBA。