Объединение событий не запускает оба события
Я пытаюсь запустить некоторый код с веб-сайта chipverify в Modelsim, и мой вывод отличается от веб-сайта. Пример с сайта о слиянии событий.
module tb;
// Create event variables
event event_a, event_b;
initial begin
fork
// Thread1: waits for event_a to be triggered
begin
wait(event_a.triggered);
$display ("[%0t] Thread1: Wait for event_a is over", $time);
end
// Thread2: waits for event_b to be triggered
begin
wait(event_b.triggered);
$display ("[%0t] Thread2: Wait for event_b is over", $time);
end
// Thread3: triggers event_a at 20ns
#20 ->event_a;
// Thread4: triggers event_b at 30ns
#30 ->event_b;
// Thread5: Assigns event_b to event_a at 10ns
begin
#10 event_b = event_a;
end
join
end
endmodule
Я ожидал вывод, как это на сайте:
[20] Thread1: Wait for event_a is over
[20] Thread2: Wait for event_b is over
Но вместо этого я получаю что-то вроде этого:
[20] Thread1: Wait for event_a is over
Тот же самый результат, когда я пытаюсь запустить этот код на edaplayground (aldec riviera pro или icarus verilog simulator). Почему event_b не запускается, когда event_a и event_b объединяются?
1 ответ
Решение
У LRM есть небольшая двусмысленность здесь. Если вы попробовали еще один инструмент на EDAPlayground, вы получите другие результаты.
Не ясно, что запись в дескриптор события должна вызвать переоценку сработавшего метода.
Смотрите эту ссылку для описания проблемы.