Help us understand the problem. What is going on with this article?

Forkしたプロセスの制御 - disable fork

More than 1 year has passed since last update.

本記事は以下の3部構成の一部です。

  1. fork joinとその仲間たち
  2. Forkしたプロセスの制御 - disable fork
  3. Forkしたプロセスの制御 - processクラス

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

triggerfish
ASIC職人です。デザイナですが検証もやります。ネタとしては検証のほうが書きやすいので、そちらが記事のメインになると思います。入門記事よりはプロの方が実務で役に立つような記事を目指しています。内容に不明点がありましたら遠慮なく質問をお願いいたします!
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away