Why the second event didn't trigger?

Hi,

Can someone help me understand why the 2nd event - kickOff didn’t trigger?
However, if moving that code out to a forever statement, then it works.

module tb;
   event start;
   event kickOff;
   int 	 cnt;

   initial begin
   
      fork
	 begin
	    #1 ->>start;
	    $display($time,,"1st trigger");

	    #10 ->>start;
	    $display($time,,"2nd trigger");

	    #10 $finish;
	 end
	 
	 forever begin
	    @start;
	    cnt++;
	    $display($time,,"start trigger %0d times",cnt);
	    ->kickOff;
	    
`ifdef TRIGGER_NOT_WORK
	    @kickOff;
	    $display($time,,"kickOff trigger %0d times",cnt);
`endif
	 end

`ifdef TRIGGER_WORK
	 forever begin
	    @kickOff;
	    $display($time,,"kickOff trigger %0d times",cnt);
	 end
`endif
	 
      join

   end
      
endmodule // tb

Hi,

Try either

->>kickOff;

OR

wait(kickOff.triggered);

Thing is → is an instantaneous event. And @event has to be executed and block the current process before triggering event occurs.
Whereas, wait(event.triggered) waits for the event triggered in current timeslot, doesn’t matter whether wait statement or → came first.

Hope it helps.

p.s. refer to “Triggering an event” section in LRM for more details.