Отсутствие задержки тактового цикла при моделировании Vivado во время задания регистра/флипфлопа

#verilog #simulation #fpga #vivado #test-bench

Вопрос:

Я пытаюсь сгенерировать импульс из сигнала ext_sample_clk . В настоящее время мой дизайн имеет 2 тактовых сигнала clk и ext_sample_clk , которые я генерирую с помощью тестового стенда. Ниже приведен мой упрощенный код. Кроме того, у меня также есть clk логика генерации и сброса, которую я не показал для простоты. Я могу поделиться ими, если понадобится.

 module tb;
reg clk;
reg rst;
reg ext_sample_clk;
reg ext_sample_clk_r1;
wire ext_sample_pulse_orig;

//clock gen logic
always 
begin
    clk = 1'b1; 
    #5; // 10 ns

    clk = 1'b0;
    #5;
end

// reset gen logic
initial 
begin 
    rst = 1;
    #(100);
    rst = 0;
end

// ext_sample_clk logic
always 
begin
    ext_sample_clk = 1'b1; 
    #50; 
    ext_sample_clk = 1'b0;
    #50; 
end

// register the ext_sample_clk logic, should infer a flip flop
always @(posedge clk) begin
    if (rst)
        ext_sample_clk_r1       <= 0;
    else
        ext_sample_clk_r1       <= ext_sample_clk; // lhs doesn't appear to be delayed by 1 clock cycle wrt to rhs
end     
assign ext_sample_pulse_orig   = ext_sample_clk        amp;amp; !ext_sample_clk_r1; 

endmodule
 

Я ожидаю, что ext_sample_clk_r1 задержится на один тактовый импульс по сравнению с ext_sample_clk. Но вот что я наблюдаю, когда запускаю симуляцию на Vivado.
введите описание изображения здесь

Может ли кто-нибудь объяснить, почему я не вижу задержки тактового цикла в ext_sample_clk_r1 со ссылкой на ext_sample_clk. Я что-то упускаю ?

Ответ №1:

Поскольку вы хотите ext_sample_clk_r1 и ext_sample_clk быть синхронными с одними и теми же часами ( clk ), вам нужно отключить их обоих posedge clk , используя неблокирующие назначения ( <= ):

 initial begin 
    ext_sample_clk = 1'b1; 
    forever begin
        repeat (10) @(posedge clk);
        ext_sample_clk <= ~ext_sample_clk;
    end
end
 

Вот пример работы на edaplayground.

Ответ №2:

Наиболее вероятный способ получения результатов, которые вы видите,-это использование блокирующего назначения ext_sample_clk вместо неблокирующего назначения. Ваш тестовый стенд должен следовать тем же правилам, как если бы он был частью дизайна, чтобы избежать условий гонки. Используйте неблокирующее назначение или попросите свой тестовый стенд применить сигналы на противоположном краю.

Комментарии:

1. Я стараюсь, чтобы мой код (помимо сброса и генерации часов) был одинаковым между дизайном и верстаком. Итак, не могли бы вы более подробно объяснить, как использование неблокирующего задания или применение моего тестового стенда к сигналам на противоположном краю решают мою проблему. Заранее спасибо.

2. Потому что время, которое ext_sample_clk растет, находится в гонке с растущим краем clk Вы не знаете, выполняется ли последний always блок до или после обновления ext_sample_clk.