Search code examples
system-verilogmodelsimedaplayground

Merging events doesn't trigger both events


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?


Solution

  • 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.