|HOME |ABOUT |ARTICLES |ACK |FEEDBACK |TOC |LINKS |BLOG |JOBS |


Tutorials



FORK JOIN


A Verilog fork...join block always causes the process executing the fork statement to block until the termination of all forked processes. With the addition of the join_any and join_none keywords, SystemVerilog provides three choices for specifying when the parent (forking) process resumes execution.




Fork Join None

The parent process continues to execute concurrently with all the processes spawned by the fork. The spawned processes do not start executing until the parent thread executes a blocking statement.



EXAMPLE : fork/join none
   program main ;
   initial
   begin
    #10;
       $display(" BEFORE fork  time = %d ",$time );
       fork 
           begin
               # (20);
               $display("time = %d # 20  ",$time );
           end
           begin
               #(10);
               $display("time = %d # 10  ",$time );
           end
           begin
               #(5);
               $display("time = %d # 5  ",$time );
           end
         join_none
    $display(" time = %d Outside the main fork ",$time );
   #(40);
   end 
   endprogram
RESULTS

 BEFORE fork  time =                   10
 time =                   10 Outside the main fork
time =                   15 # 5
time =                   20 # 10
time =                   30 # 20


Fork Join Any

The parent process blocks until any one of the processes spawned by this fork completes.

EXAMPLE : fork/join any
   program main;
   initial begin
    #(10);
       $display(" BEFORE fork  time = %d ",$time ); 
       fork
           begin
               # (20);
               $display("time = %d # 20  ",$time );
           end
           begin
               #(10);
               $display("time = %d # 10  ",$time );
           end
           begin
               #(5);
               $display("time = %d # 5  ",$time );
           end
         join_any
    $display(" time = %d Outside the main fork ",$time );
   #(40);
   end 
   endprogram
RESULTS

BEFORE fork  time =                   10
time =                   15 # 5
 time =                   15 Outside the main fork
time =                   20 # 10
time =                   30 # 20


For Join All

The parent process blocks until all the processes spawned by this fork complete.

EXAMPLE : fork/join all
program main ;
initial
begin
 #(10);
    $display(" BEFORE fork  time = %d ",$time );
    fork
        begin
            # (20);
            $display("time = %d # 20  ",$time );
        end
        begin
            #(10);
            $display("time = %d # 10  ",$time );
        end
        begin
            #(5);
            $display("time = %d # 5  ",$time );
        end
      join
 $display(" time = %d Outside the main fork ",$time );
#(40);
end
endprogram
RESULTS


 BEFORE fork  time =                   10
time =                   15 # 5
time =                   20 # 10
time =                   30 # 20
 time =                   30 Outside the main fork


When defining a fork/join block, encapsulating the entire fork inside begin..end, results in the entire block being treated as a single thread, and the code executes consecutively.

EXAMPLE : sequential statement in fork/join
program main ;
initial begin
 #(10);
    $display(" First fork  time = %d ",$time ); 
    fork 
        begin
            # (20);
            $display("time = %d # 20  ",$time);
        end
        begin
            #(10);
            $display("time = %d # 10  ",$time);
        end
        begin
            #(5);
            $display("time = %d # 5  ",$time);
            #(2);
            $display("time = %d # 2  ",$time);
        end
      join_any
  $display(" time = %d Outside the main fork ",$time );
#(40);
end 
endprogram
RESULTS:

First fork  time =                   10
time =                   15 # 5
time =                   17 # 2
 time =                   17 Outside the main fork
time =                   20 # 10
time =                   30 # 20


Index
Introduction
Data Types
Literals
Strings
Userdefined Datatypes
Enumarations
Structures And Uniouns
Typedef
Arrays
Array Methods
Dynamic Arrays
Associative Arrays
Queues
Comparison Of Arrays
Linked List
Casting
Data Declaration
Reg And Logic
Operators 1
Operators 2
Operator Precedency
Events
Control Statements
Program Block
Procedural Blocks
Fork Join
Fork Control
Subroutines
Semaphore
Mailbox
Fine Grain Process Control

Report a Bug or Comment on This section - Your input is what keeps Testbench.in improving with time!





<< PREVIOUS PAGE

TOP

NEXT PAGE >>

copyright © 2007-2017 :: all rights reserved www.testbench.in::Disclaimer