Рассмотрим приведенный ниже пример:
module test;
reg a;
initial begin
a = 1'b1;
end
initial begin
wait(a) $display("wait(a): %b", a);
$display("wait(a)");
end
initial begin
@a $display("@a: %b", a);
$display("@a");
end
endmodule
Когда я его запускаю, я всегда получаю такой вывод:
wait(a): 1
wait(a)
Что меня смущает. Мое понимание кода выглядит следующим образом:
- значение по умолчанию для
a
равно x
. - все начальные блоки начинаются параллельно в момент времени 0.
- первый начальный блок выполняет назначение блока, в то время как элементы управления событиями
wait
и @a
читают a
. - , поскольку нет последовательности в последовательности между этими тремя, блокировкаприсвоение
a=1'b1
, может быть выполнено до или после wait(a)
или @a
. - , если назначение блокировки выполнено до
wait(a)
и @a
, выходные данные не должны отображаться, так как wait(a)
и @a
не обнаружит никаких изменений в a
. - , если, однако, присвоение блокировки
a=1'b1
выполняется после чтения a
в wait(a)
и @a
, которые обабудет читаться как x
, тогда выход из обоих должен отображаться после завершения назначения блокировки.
Но, как я указал выше, вывод, который я вижу, всегда является выводом из wait(a)
,Может кто-нибудь, пожалуйста, объясните мне:
- Что происходит и дефект в моем понимании?
И в целом, и за пределами приведенного выше примера:
Что именно происходит, когда симулятор обнаруживает
wait(a)
и
@a
?
wait(a)
и
@a
, обнаруживающие изменения уровня и фронта (в примере изменения уровня и края идентичны). Когда мы говорим «изменить» в этом случае, означает ли это изменение после последнего чтения переменных, участвующих в элементах управления событиями (в этом примере
a
)?
Спасибо