Рассмотрим пример ниже:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
end
endmodule
В приведенном выше примере отображается 0. Моя причина в том, что неблокирующее назначение будет назначено на шаге 3 «Стратифицированной очереди событий», в то время как назначение блокировки и $ display выполняются на шаге 1. Если я изменю пример как:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$display(a);
$monitor(a);
end
endmodule
Затем печатаются 0 и 1, потому что я предполагаю, что $ monitor выполняется на шаге 4 очереди событий (?). Но если я изменю пример дальше:
module test;
reg a;
initial begin
a = 1'b0;
a <= 1'b1;
$monitor(a);
$display(a);
end
endmodule
Снова вывод: 0 и 1 - чего я не ожидал. Я ожидал, что будут напечатаны 1 и 1, потому что $ monitor будет оцениваться на шаге 4 очереди событий, когда «a» уже будет 1. После этого у нас есть $ display, который должен напечатать 1.
Ссылки Я мог найти разговоры о «текущем времени моделирования» и «стратифицированной очереди событий», но я не уверен, как это работает.
Я ценю ваше объяснение! Спасибо