IMPORTANT NOTICE: Please be advised that the Verification Academy Forums will be offline for scheduled maintenance on Sunday, March 23rd at 4:00 US/Pacific.
//fork join_none functionality using fork join
module top;
initial
begin
fork
begin : b1
#5 $display($time, " from block b1");
end : b1
begin : b2
#10 $display($time, " from block b2");
end : b2
join
$display($time, " from outside fork-join block");
end
endmodule
how to make it work like fork join_none and fork join_any
Although it’s possible to make this contrived example work like join_none or join_any
module top;
event ev_any, ev_none;
initial
begin
fork
begin : b1
-> ev_none;
#5 $display($time, " from block b1");
-> ev_any;
end : b1
begin : b2
-> ev_none;
#10 $display($time, " from block b2");
-> ev_any;
end : b2
begin
@(ev_none) // replace with @(ev_any) to get join_any functionality
$display($time, " from outside fork-join block");
end
join
end
endmodule
It would be very difficult to get this functionality was embedded inside a task or loop.
module top;
initial
begin
fork
begin : b1
#5 $display($time, " from block b1");
end : b1
begin : b2
#10 $display($time, " from block b2");
end : b2
join
$display($time, " from outside fork-join block");
end
endmodule
# 5 from block b1
# 10 from block b2
# 10 from outside fork-join block
this is the output which i get for the above code using fork-join_none
//************************************************************************************
module top;
initial
begin
fork
begin : b1
#5 $display($time, " from block b1");
end : b1
begin : b2
#10 $display($time, " from block b2");
end : b2
join_none
$display($time, " from outside fork-join block");
end
endmodule
# 0 from outside fork-join block
# 5 from block b1
# 10 from block b2
this is the output for the code with fork-join_none
my doubt is what should be done to the first code so that i get the output as the second one
Your question is lacking a purpose. The code I showed you above produce the same results as the fork/join_none. Here is another example
module top;
initial
begin : b1
#5 $display($time, " from block b1");
end : b1
initial
begin : b2
#10 $display($time, " from block b2");
end : b2
initial
begin
$display($time, " from outside fork-join block");
end
endmodule
There are many ways to get the same output results. but there is no way to spawn a process in the background without join_none or join_any.
The reason this is not working for join_none implementation is, for ev_none event the wait statement and triggering is being executed at the same time. We should replace the blocking trigger(->) with non-blocking trigger(->>) or change the @(ev_none); to wait(ev_none.triggered);
Here’s the updated code for fork/join_none using fork/join:
module top;
event ev_none;
initial
begin
fork
begin : b1
->> ev_none;
#5 $display($time, " from block b1");
end : b1
begin : b2
->> ev_none;
#10 $display($time, " from block b2");
end : b2
begin
wait(ev_none.triggered);
$display($time, " from outside fork-join block");
end
join
end
endmodule