本記事は以下の3部構成の一部です。
disable forkとは
disable forkはforkしたプロセスを停止する命令です。
disableと似ていますが、disableは引数を取るのに対してdisable forkでは引数がありません。命令が実行されたスコープ内での全てのforkされたプロセスが停止します。複数のプロセスを一気にまとめて停止するのに便利ですが、スコープに注意を払わないと意図したものより多くのプロセスを停止させてしまう可能性があるので注意してください。
下のサンプルプログラムでは複数のforkしたプロセスで、シミュレーション開始から3ns後にメッセージを表示させています。並行して2nsの時点でdisable forkでスコープ内にあるプロセスを停止させています。
ログの通り、メッセージが表示されているのはdisable forkより上の階層にある"d1"のみとなります。
module top;
initial begin
fork: d1
delayPrint("d1", 3ns);
begin
fork: d2_a
delayPrint("d2_a", 3ns);
join_none
fork: d2_b
delayPrint("d2_b", 3ns);
fork: d3
delayPrint("d3", 3ns);
join
join_none
#2ns;
disable fork;
end
join
end
task automatic delayPrint(input string s,
input time dly = 0ns);
#dly;
$display(s);
endtask
endmodule
run -all;
# KERNEL: d1
# KERNEL: Simulation has finished. There are no more test vectors to simulate.
参考文献
"9.6.3 Disable fork statement". 1800-2017 - IEEE Standard for SystemVerilog--Unified Hardware Design, Specification, and Verification Language. p.229