Я генерирую разделенные часы, что-то вроде этого:
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
и предотвратить возникновение состояния гонки?