Всегда против навсегда в Verilog HDL

В чем разница между always ключевое слово (не always @ блок) и forever Ключевое слово в Verilog HDL?

always #1 a=!a;
forever #1 a=!a;

Вот мои выводы, но я все еще не могу провести черту между ними:

Из Википедии:

Ключевое слово Always действует аналогично конструкции "C" while(1) {..} в том смысле, что оно будет выполняться вечно.

Из электроСофта:

Инструкция forever постоянно повторяет утверждение, которое следует за ней. Поэтому его следует использовать с процедурными элементами управления временем (в противном случае он зависает при симуляции).

Может ли кто-нибудь дать более четкое объяснение этому? Спасибо!

1 ответ

Решение

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

  • always @(posedge clk) <do stuff>

  • always @(en or d) <do stuff>

  • always @* <do stuff>также можно использовать @(*)

Это типичный способ записи защелок, флопов и т. Д.

forever Конструкция, напротив, является процедурным утверждением, которое обычно должно использоваться только в коде тестового стенда. Это может произойти в течение always а также initial блоки и другие операторы, но не могут появляться непосредственно в модуле. Например, вы можете использовать его для написания таких вещей, как:

initial begin
  if (do_random_testing)
  begin
    forever #100 input = $random(...);
  end
  else if (read_from_file)
  begin
     ... read inputs from a file or whatever ...
  end
end

Не было бы законно писать что-то вроде forever #1 a=!a; как конструкция верхнего уровня в модуле. Это должно быть помещено, например, в always блок, initial блок, task, или похожие.

Другие вопросы по тегам