#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.