#system-verilog #verification
#system-verilog #проверка
Вопрос:
Я пишу код проверки в system verilog. По причинам, выходящим за рамки этого вопроса, мне нужно проверить, является ли в течение высокого периода следующего тактового цикла (т. Е. Между следующим восходящим и нисходящим фронтом) сигнал импульсами вверх и вниз ровно один раз.
Хотя это можно легко сделать с помощью конечного автомата, поскольку это не обязательно должно быть синтезируемым, я надеюсь воспользоваться конструкциями SV, чтобы сделать намерение кода более заметным.
Я рассматривал возможность использования решения на основе событий:
event re_clk, fe_clk, re_sig, fe_sig;
fork
forever begin @(pos_edge clk)
-> re_clk; end
forever begin @(neg_edge clk)
-> fe_clk; end
forever begin @(pos_edge sig)
-> re_sigl end
forever begin @(neg_edge sig)
-> fe_sig; end
begin
wait_order(re_clk, re_sig, fe_sig, fe_clk);
//Set some signals.
else
//Set other signals.
end
join_any
disable fork;
Это решение невероятно подробное. Есть ли более идиоматический подход?
Ответ №1:
Вы могли бы сделать следующее, что выглядит более лаконично для меня:
bit good_pulse = 0;
fork
@(posedge clk) @(negedge clk);
begin
@(posedge sig) @(negedge sig) good_pulse = 1;
@(posedge sig) good_pulse = 0;
end
join_any
disable fork;
if (good_pulse)
//Set some signals.
else
//Set other signals.