0

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?

hjuston
  • 5
  • 3

1 Answers1

0

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.

dave_59
  • 39,096
  • 3
  • 24
  • 63
  • Did i understand correctly: expression "event_b.triggered" is not evaluated because "->event_a" and "->event_b" expressions after event merging is the same thing for simulator - triggering event_a - not event_b? – hjuston Jun 05 '19 at 17:20
  • That maches my understanding of the problem. – dave_59 Jun 05 '19 at 17:41