Идиома для обнаружения последовательности восходящих / нисходящих ребер в systemverilog

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