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

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

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

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

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

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

От electroSofts:

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

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


person ellekaie    schedule 28.11.2014    source источник
comment
Аналогичный вопрос, вы можете найти ответ stackoverflow. com/questions/15938158/   -  person chitranna    schedule 28.11.2014
comment
Видимо, я не видел этого вопроса в своих поисках здесь и даже в Google, интересно, почему. В любом случае, спасибо @chitranna!   -  person ellekaie    schedule 29.11.2014


Ответы (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 и т.п.

person Jared Davis    schedule 28.11.2014