Определение сгенерированных часов как синхронных в RTL-симуляции - PullRequest
0 голосов
/ 09 января 2019

Я генерирую разделенные часы, что-то вроде этого:

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 и предотвратить возникновение состояния гонки?

1 Ответ

0 голосов
/ 10 января 2019

Это тот случай, когда НБА не должны использоваться. Вы не должны иметь никаких NBA в своем дереве часов (включая стробированные часы), если вы хотите, чтобы часы оставались синхронными.

...