Многие люди не понимают, что @ является модификатором оператора, а не конструируется сам по себе. В нем говорится отложить утверждение, которое следует, до тех пор, пока не произойдет событие. @(A or B)
означает ожидание, пока не произойдет изменение значения A или B (не путать с изменением результата A | B). @*
означает, что посмотрите на следующее утверждение и создайте неявный список чувствительности для ожидания изменения.
always @(A or B) C = A + B;
always begin
@(A or B) C = A + B;
end
always begin
@* C = A + B;
end
always_comb
begin
C = A + B;
end
Эти 4 always
блоки имеют идентичное поведение, за исключением последнего always_comb
также запускаются в момент времени 0 независимо от каких-либо изменений в A или B.
Если вы посмотрите на код, который следует за always
как процедурную последовательность выполнения операторов, может быть проще увидеть конструкцию @
как часть этой процедурной последовательности, и изменение должно произойти, пока вы выполнение конструкции. Простое добавление еще одной задержки покажет эту концепцию (не синтезируемую)
always @(A or B) begin
#10 C = A + B;
end
Здесь написано «дождитесь изменения A или B, затем подождите еще 10 единиц времени, затем сделайте присваивание C с текущими значениями A + B». Если A или B изменяются в течение 10-секундного периода ожидания, это изменение пропускается. Вы должны ждать другого изменения на А или В после этих 10 единиц времени.