Poll

Do you like the discussion forum ?

In the previous article, different ways to launch parallel threads was discussed. Now we'll see how to disable forked off threads.

All active threads that have been kicked off from a fork join block can be killed by calling disable fork.

Why disable a fork ?

The following things happen at the start of simulation for the given example:

  1. Main thread executes initial block and finds a fork join_any block
  2. It will launch three threads in parallel, and wait for any one of them to finish
  3. Thread1 finishes first because of least delay
  4. Execution of main thread is resumed

Thread2 and Thread3 are still running even though the main thread has come out of fork join_any block.

 
module tb_top;
 
  initial begin
    // Fork off 3 sub-threads in parallel and the currently executing main thread
    // will finish when any of the 3 sub-threads have finished.
    fork
 
      // Thread1 : Will finish first at time 40ns
      #40 $display ("[%0t ns] Show #40 $display statement", $time);    
 
      // Thread2 : Will finish at time 70ns
      begin
        #20 $display ("[%0t ns] Show #20 $display statement", $time);
        #50 $display ("[%0t ns] Show #50 $display statement", $time);
      end
 
      // Thread3 : Will finish at time 60ns
      #60 $display ("[%0t ns] TIMEOUT", $time);
    join_any
 
    // Display as soon as the fork is done
    $display ("[%0tns] Fork join is done", $time);      
   end
endmodule
 
Simulation Log
ncsim> run
[20 ns] Show #20 $display statement
[40 ns] Show #40 $display statement
[40ns] Fork join is done
[60 ns] TIMEOUT
[70 ns] Show #50 $display statement
ncsim: *W,RNQUIE: Simulation is complete.
ncsim> exit

Click to try this example in a simulator!   

What happens when fork is disabled ?

The same example is taken from above, and disable fork is added towards the end.

Note that Thread2 and Thread3 got killed because of disable fork

 
module tb_top;
 
  initial begin
       // Fork off 3 sub-threads in parallel and the currently executing main thread
        // will finish when any of the 3 sub-threads have finished.
    fork
 
         // Thread1 : Will finish first at time 40ns
         #40 $display ("[%0t ns] Show #40 $display statement", $time);    
 
         // Thread2 : Will finish at time 70ns
         begin
            #20 $display ("[%0t ns] Show #20 $display statement", $time);
            #50 $display ("[%0t ns] Show #50 $display statement", $time);
         end
 
         // Thread3 : Will finish at time 60ns
          #60 $display ("[%0t ns] TIMEOUT", $time);
      join_any
 
      // Display as soon as the fork is done
      $display ("[%0tns] Fork join is done, let's disable fork", $time);      
 
      disable fork;
   end
endmodule
 
Simulation Log
ncsim> run
[20 ns] Show #20 $display statement
[40 ns] Show #40 $display statement
[40ns] Fork join is done, let's disable fork
ncsim: *W,RNQUIE: Simulation is complete.
ncsim> exit

Click to try this example in a simulator!   

You may also like:

You consent to our cookies if you continue to use our website. To know more about cookies, see our privacy policy. I accept cookies from this site.

Agree