Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

SystemVerilog: process(その2)

Verification Engineerの戯言 : SystemVerilogの世界へようこそ


各プロセスに対して、次の4つの関数あるいはタスクが用意されています。

    kill()    : プロセス(このプロセス内で生成した子プロセスも)を終了する。
   await()   : 他のプロセスが終了するのを待ちます
                (自分自身に対してこのawait()を実行することはできません)
    suspend() : 自分あるいは他のプロセスを一時的に停止します。
    resume()  : 停止しているプロセスを復帰させます

processの例として、IEEE 1800-2005から引用です。

    task do_n_way( int N );

      process job[1:N];

      for ( int j = 1; j <= N; j++ )
        fork
          automatic int k = j;
          begin job[j] = process::self(); ... ; end
        join_none

      for( int j = 1; j <= N; j++ ) // wait for all processes to start
        wait( job[j] != null );

      job[1].await(); // wait for first process to finish

      for ( int k = 1; k <= N; k++ ) begin
        if ( job[k].status != process::FINISHED )
          job[k].kill();
      end
    
    endtask

fork/join_none部でプロセスがN個生成されます。
生成されたプロセスのハンドルは、jobに格納します。

wait文で各プロセスが起動したかどうか確認します。
プロセスが起動できれば、job[j]にはprocessのハンドラが代入されるので
nullではありません。ここでハンドラがnullでないことを確認しないと、
それ以降、ハンドラにアクセスした場合、nullである可能性があり、そうなると
nullに対するアクセスになり、エラーになるので注意してください。

次のjob[1].await()では、job[1]が終了するまで待ちます。

最後のfor文では、各プロセスが正常終了していないときにjob[k].kill()
プロセスを強制的に終了しています。

このようにprocessを使うことで、fork/joinで生成したプロセスの制御ができます。

検証、Verification、SystemVerilog