I'm trying to run some code from chipverify website in Modelsim and my output is different than on website. Example from website is about event merging.
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
I expected output like this on website:
[20] Thread1: Wait for event_a is over
[20] Thread2: Wait for event_b is over
But instead i get something like this:
[20] Thread1: Wait for event_a is over
The same result is when I try to run this code on edaplayground (aldec riviera pro or icarus verilog simulator). Why event_b is not triggered when event_a and event_b are merged?
The LRM is has a little ambiguity here. If you tried one more tool on EDAPlayground, you get different results.
It's not clear that writing to the event handle should cause a re-evaluation of the triggered method.
See this link for a description of the problem.