Systemverilog утверждение сигнала является истинным, по крайней мере, 1 случай во время моделирования - PullRequest
0 голосов
/ 30 мая 2018

Я столкнулся с проблемой при попытке написать это утверждение.Я пытался утверждать сценарий, что сигнал B должен быть истинным, по крайней мере, 1 вхождение после сигнала A, истинного.

Утверждение, которое я написал ниже:

example  : assert property(
       @(posedge clk) disable iff(reset)
       A |-> ##[0:$] B[->1]) else `uvm_error(....)

Проблема в том, что если во время симуляции сигнал B никогда не будет истинным после того, как A истина, uvm_errorне выполненоЯ ожидал, что это будет выполнено, и симуляция сообщает об этом:

example: started at xxxxxxps not finished

Кажется, утверждение не закончено, даже если симуляция достигает конца.

Я посмотрел в гугле, есть похожий вопрос: Утверждение, чтобы проверить на переключение (0-> 1) сигнала

Я также пытался использовать strong() операция, это тоже не помогло.

Как решить эту проблему?

1 Ответ

0 голосов
/ 31 мая 2018

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

Я думаю, что ваше решение таково:

  example3  : assert property(
       @(posedge clk) disable iff(reset)
    A |-> s_eventually B)
    else 
      $error("%t - Assertion example3 failed", $time);

на основе его работы на двух симуляторах и моего понимания SVA.В одном симуляторе оператор $error в блоке действий фактически выполняется и отображается сообщение "Assertion example3 failed";в другом отображается общее сообщение об ошибке.

s_ означает «сильный».Утверждение означает, что B должно произойти за некоторое время до окончания симуляции.

Вот MCVE .На ваш вопрос было бы легче ответить, если бы вы включили что-то вроде этого.

module M;

  bit stop;  bit clk; initial while (!stop) #5 clk = ~clk;

  bit A, B;

  initial begin
    #20 A = 1;
    #10 A = 0;
    // #10 B = 1;
    #10 B = 0;
    #50 stop = 1;
  end

  example1  : assert property(
       @(posedge clk)
    A |-> B[->1]) 
    else 
      $error("%t - Assertion example1 failed", $time);

  example2  : assert property(
       @(posedge clk)
    A |-> eventually [0:7] B)
    else 
      $error("%t - Assertion example2 failed", $time);

  example3  : assert property(
       @(posedge clk)
    A |-> s_eventually B)
    else 
      $error("%t - Assertion example3 failed", $time);

   final
     $display("Finished!");

endmodule

https://www.edaplayground.com/x/2RtF

...