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;
initialbegin #(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 ;
initialbegin #(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