всегда блокировать без списка чувствительности - $ display не выполняется - PullRequest
1 голос
/ 20 июня 2020

Когда я запускаю следующий код Verilog, я получаю сообщение об ошибке:

предупреждение: @ * не обнаружил чувствительности, поэтому он никогда не сработает.

module main;
  
  reg b;
  always @(*) begin
    
    $display("entered always block/n");
  end
  
endmodule

Может кто-нибудь, пожалуйста, подробнее об этом? Есть ли способ использовать $display без "списка чувствительности"?

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Ваш симулятор правильно предупреждает вас о необычной ситуации. Этот оператор $display никогда не будет выполнен. Следовательно, это бесполезный код.

Список неявной чувствительности (@*) означает, что он будет введен только в том случае, если какой-либо сигнал (например, b) изменит значение, и он используется справа сторона (RHS) некоторого выражения внутри always. Проблема в том, что внутри вашего блока нет сигнала. См. IEEE Std 1800-2017, раздел 9.4.2.2 Неявный список выражений_выражений .

Если вы добавите b к вашему тривиальному примеру, блок always будет запущен, если есть любые изменения на b:

module main;
  
  reg b;
  always @(*) begin
    $display("entered always block and b=%b", b);
  end

initial begin
    b=0;
    #50 $finish;
end

always #5 b = ~b;
    
endmodule

Выводы:

entered always block and b=0
entered always block and b=1
entered always block and b=0
entered always block and b=1
entered always block and b=0
entered always block and b=1
entered always block and b=0
entered always block and b=1
entered always block and b=0
entered always block and b=1

Пример выполнения на edaplayground .

1 голос
/ 20 июня 2020

Конструкция always вводит процедурную последовательность кода, которая зацикливается до бесконечности. Он должен иметь хотя бы одну конструкцию процедурной блокировки, иначе он попадет в бесконечную нулевую задержку l oop. И это предотвращает выполнение чего-либо еще.

Предполагаемое использование always - ждать изменения какого-либо сигнала или ждать некоторой задержки по времени. Но если вы хотите, чтобы $display выполнялся только один раз, используйте initial вместо always, и он начнет выполнение процедурной последовательности один раз в момент времени 0, а не l oop.

...