Ready-to-run snippets

Code Examples

Ready-to-run Verilog, SystemVerilog, and UVM examples. Click any to open it live in the IDE.

← All examples

Merging Events

SystemVerilog Interprocess Communication

Reassigning one event handle to another at run time (event_b = event_a) so a wait on event_b is satisfied when event_a triggers.

Open in IDE
testbench.sv
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
        // Comment code below and try again to see Thread2 finish later
        #10 event_b = event_a;
      end
    join
  end
endmodule

/* 
Simulation Log:
---------------
ncsim> run
[20] Thread1: Wait for event_a is over
[20] Thread2: Wait for event_b is over
ncsim: *W,RNQUIE: Simulation is complete.
ncsim> exit
*/
design.sv
// Code your design here
Admin mode — edit and delete controls are visible on each row. Use the IDE to add new snippets via File → Save as Snippet.