I have question on fork join working in the below code where the case 3 is always selected, is it guaranteed that case 3 is always selected if the signal “complete” changes from 0 to F or can it pick other cases as well randomly?
What is the better way to make sure all the cases are selected even if the signal “complete” changes from 0 to F.?
module fork_test1;
logic [3:0] complete = 4'h0;
logic in_progress;
initial begin
#10;
capture_complete();
end
initial begin
in_progress = '1;
#15;
complete = '0;
#30;
complete = 4'hF;
#100; $finish();
end
task capture_complete();
for(int i = 0; i < 4; i++) begin
fork
automatic int j = i;
$display("%0t,J = %0d",$time,j);
forever @(complete[j]) begin
$display("%0t,entering forever j=%0d",$time,j);
if(in_progress == 1'b1) begin
$display("%0t,Captured initcomplete[%0d] = %0b",$time ,j, complete[j]);
case(j)
0: begin
if(complete[j] === 1'b1) begin
$display("%0t,case0 selected",$time);
end
end
1: begin
if(complete[j] === 1'b1) begin
$display("%0t,case1 selected",$time);
end
end
2: begin
if(complete[j] === 1'b1) begin
$display("%0t,case2 selected", $time);
end
end
3: begin
if(complete[j] === 1'b1) begin
$display("%0t,case3 selected",$time);
in_progress = 1'b0;
$display("in_progress = 0");
end
end
endcase
end
end
join_none
end
endtask : capture_complete
endmodule:fork_test1
Output observed:
10,J = 0
10,J = 1
10,J = 2
10,J = 3
45,entering forever j=3
45,Captured initcomplete[3] = 1
45,case3 selected
in_progress = 0
45,entering forever j=2
45,entering forever j=1
45,entering forever j=0