Join_none
join_noneは、親プロセスがブロックしないで、動作を継続する点がjoinと異なる。
LRMでは、「親プロセスがブロッキングステートメントを実行するまで子プロセスは起動されない」と、ちょっと意味がとりにくい表現になっているが、同じ時刻内でのデルタディレイによるステートメントの実行順を気にしなければ、「子プロセスを起動し、親プロセスもそのままブロックしないで動作を継続する」という解釈でよさそうだ。
この機能は、メインのプロセスとは独立して信号等をモニタするプロセスを作るのに利用できる。
以下の例では、iの値が変化する度にそれを表示するプロセスをforkしている。
この例程度のことならalwaysでもできるのだが、join_noneを使えば、プロセスを動的に生成、消去できるため、よりきめ細かな制御が可能だ。
`timescale 1ns/10ps
module test();
initial begin
int i;
fork
forever
@i $display("Value Changed to %d", i);
join_none
#10 i = 5;
#10 i = 170;
#10 i = 2;
#10 i = 32;
#10 $display("Test Finished");
end
endmodule
# 6.5e
# vsim -do {run -all; quit} -c test
# Loading sv_std.std
# Loading work.test
# run -all
# Value Changed to 5
# Value Changed to 170
# Value Changed to 2
# Value Changed to 32
# Test Finished
# quit