Join_any
join_anyでは、子プロセスのforkを行い、親プロセスがブロックする。ここまでは、従来のfork joinと同じ動作だが、この後の親プロセスの動作再開条件が異なる。
joinの場合、全ての子プロセスが動作を終了するまで親プロセスがブロックするが、join_anyでは、どれか一つの子プロセスが終了すると動作を再開する。
この機能の使用例としては、シミュレーション時のタイムアウト機能の実装があげられる。
以下の例では、forkで二つのプロセスを起動している。一つはforループで特定時間毎にシミュレーション上の時間を表示するプロセス、もう一つは100nsの時間待ち後にタイムアウトのメッセージを表示するプロセスだ。
一つ目の子プロセスのほうが実行時間が長いため、二つ目のプロセス終了後、親プロセスの実行が再開される。
次の行のdisable forkは、forkで実行中の他プロセスを強制終了するのに使用される。この場合、最初のforループのプロセスが強制終了される。
`timescale 1ns/10ps
module test();
initial begin
fork
for (int i = 1; i <= 128; i *= 2)
#i $display("time =%dns", $stime);
#100 $display("Timeout at %dns", $stime);
join_any
disable fork;
$display("Test Finished");
end
endmodule
# 6.5e
# vsim -do {run -all; quit} -c test
# Loading sv_std.std
# Loading work.test
# run -all
# time = 1ns
# time = 3ns
# time = 7ns
# time = 15ns
# time = 31ns
# time = 63ns
# Timeout at 100ns
# Test Finished
# quit