The wait fork statement is used to ensure that all immediate child subprocesses (processes created by the current process, excluding their descendants) have completed their execution.
EXAMPLE program main();
initialbegin #(10);
$display(" BEFORE fork time = %0d ",$time );
fork begin # (20);
$display(" time = %0d # 20 ",$time );
end begin #(10);
$display(" time = %0d # 10 ",$time );
end begin #(5);
$display(" time = %0d # 5 ",$time );
end join_any $display(" time = %0d Outside the main fork ",$time );
end endprogram
RESULTS
BEFORE fork time = 10 time = 15 # 5 time = 15 Outside the main fork
In the above example, Simulation ends before the #10 and #20 gets executed. In some situations, we need to wait until all the threads got finished to start the next task. Using wait fork, will block the till all the child processes complete.
EXAMPLE: program main();
initialbegin #(10);
$display(" BEFORE fork time = %0d ",$time );
fork begin # (20);
$display(" time = %0d # 20 ",$time );
end begin #(10);
$display(" time = %0d # 10 ",$time );
end begin #(5);
$display(" time = %0d # 5 ",$time );
end join_any $display(" time = %0d Outside the main fork ",$time );
waitfork ;
$display(" time = %0d After wait fork ",$time );
end endprogram RESULTS
BEFORE fork time = 10 time = 15 # 5 time = 15 Outside the main fork time = 20 # 10 time = 30 # 20 time = 30 After wait fork
Disable Fork Statement
The disable fork statement terminates all active descendants (subprocesses) of the calling process.
In other words, if any of the child processes have descendants of their own, the disable fork statement shall terminate them as well. Sometimes, it is required to kill the child processes after certain condition.
EXAMPLE program main();
initialbegin #(10);
$display(" BEFORE fork time = %0d ",$time );
fork begin # (20);
$display(" time = %0d # 20 ",$time );
end begin #(10);
$display(" time = %0d # 10 ",$time );
end begin #(5);
$display(" time = %0d # 5 ",$time );
end join_any $display(" time = %0d Outside the main fork ",$time );
end
initial #100 $finish;
endprogram RESULTS
BEFORE fork time = 10 time = 15 # 5 time = 15 Outside the main fork time = 20 # 10 time = 30 # 20
In the following example, disable for kills the threads #10 and #20.
EXAMPLE program main();
initialbegin #(10);
$display(" BEFORE fork time = %0d ",$time );
fork begin # (20);
$display(" time = %0d # 20 ",$time );
end begin #(10);
$display(" time = %0d # 10 ",$time );
end begin #(5);
$display(" time = %0d # 5 ",$time );
end join_any $display(" time = %0d Outside the main fork ",$time );
disablefork;
$display(" Killed the child processes");
end
initial #100 $finish;
endprogram RESULTS
BEFORE fork time = 10 time = 15 # 5 time = 15 Outside the main fork Killed the child processes