ALL ABOUT FORK JOIN
IN SV
BY SIREESHA DEVI,
VERFICATION TRAINER
SystemVerilog Processes
A process also called as thread is a piece of code thet gets executed as a
separate entity.
In Verilog each of initial and always block are spawed of as separate threads that
start to run in parallel from zero time.
In sv we introduce fork_join threads that run in [Link] are 3 different
style of fork join threads;
VLSI TO
YOU
YOUTUBE
CHANNEL
Fork..Join:
Fork…Join construct of System Verilog actually enables concurrent execution of
each of its statements/threads/processes.
This feature is most widely used in System Verilog Test Benches.
System Verilog came up with new and advanced flavors of fork join construct
which adds a lot of value for implementers.
1. Fork..Join_any
2. Fork..Join_none
VLSI TO
YOU
YOUTUBE
CHANNEL
Fork join statements flow:
module fork_join_example;
Fork join example:
initial begin
fork
begin // process A
In the example, there are three
$display("Process A started at time = %0t", $time);
processes A, B, and C. All started at #10;
$display("Process A completed at time = %0t", $time);
the same time.
end
Execution time for process A: 10ns begin // process B
Execution time for process B: 15ns $display("Process B started at time = %0t", $time);
#15;
Execution time for process C: 20ns $display("Process B completed at time = %0t", $time);
Output: end
begin // process C
$display("Process C started at time = %0t", $time);
Process A started at time = 0
#20;
Process B started at time = 0
$display("Process C completed at time = %0t", $time);
Process C started at time = 0 end
Process A completed at time = 10 join VLSI TO
Process B completed at time = 15 $display("fork-join completed at time = %0t", $time); YOU
Process C completed at time = 20 end YOUTUBE
endmodule CHANNEL
fork-join completed at time = 20
Fork join any statements flow
VLSI TO
YOU
YOUTUBE
CHANNEL
In fork-join_any, all processes start simultaneously and join_any will wait for any one process to
fork join_any be completed.
module fork_join_any_example;
initial begin
fork
In this example fork join any will begin // process A
be completed even if any one of
$display("Process A started at time = %0t", $time);
the three process is completed
#10;
$display("Process A completed at time = %0t", $time);
end
begin // process B
Output: $display("Process B started at time = %0t", $time);
#15;
$display("Process B completed at time = %0t", $time);
Process A started at time = 0 end
Process B started at time = 0
begin // process C
Process C started at time = 0
$display("Process C started at time = %0t", $time);
Process A completed at time = 10
fork-join_any completed at time = 10 #20;
Process B completed at time = 15 $display("Process C completed at time = %0t", $time); VLSI TO
Process C completed at time = 20 end YOU
join_any YOUTUBE
$display("fork-join_any completed at time = %0t", $time); CHANNEL
Fork join_none statements flow:
VLSI TO
YOU
YOUTUBE
CHANNEL
module fork_join_none_example;
initial begin
fork • In fork-join_none, all processes start
begin // process A simultaneously and join_none will not wait for
$display("Process A started at time = %0t", $time);
any process to be completed.
#10;
• So, we can say that fork-join and fork-join_any
$display("Process A completed at time = %0t", $time);
end is blocked due to process execution time,
begin // process B whereas fork-join_none is not blocked due to
$display("Process B started at time = %0t", $time);
any process.
#15;
• module fork_join_none_example;
$display("Process B completed at time = %0t", $time);
end • Fork-join_none will be completed without
begin // process C waiting for any process completion.
$display("Process C started at time = %0t", $time);
#20; Output:
$display("Process C completed at time = %0t", $time);
fork-join_none completed at time = 0
end Process A started at time = 0
join_none Process B started at time = 0
Process C started at time = 0 VLSI TO
$display("fork-join_none completed at time = %0t", $time);
Process A completed at time = 10 YOU
end Process B completed at time = 15
Process C completed at time = 20
YOUTUBE
endmodule
CHANNEL