Всегда против навсегда в 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
, или похожие.