Vengineerの妄想(準備期間)

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

processクラス


SystemVerilogには、processクラスというものがあります。
  AldecのSystemVerilogリファレンスのClass processからの引用

    class process;
      typedef enum { FINISHED, RUNNING, WAITING, SUSPENDED, KILLED } state;

      extern static function process self();
      extern function state status();
      extern function void kill();
      extern task await();
      extern function void suspend();
      extern function void resume();
    endclass

fork/joinで起動したプロセスの状態をこのprocessクラスを使って制御できます。
  AldecのSystemVerilogリファレンスのClass processからの引用

  module top;
    parameter numproc = 3;
    process parr[0:numproc-1];

    task show_status;
      process::state status;
      for( int i = 0; i < numproc; ++i ) begin
        status = parr[i].status();
        $display("Process num %0d, status at time %0t - %s.", i, $time, status.name);
      end
    endtask

    initial begin
      for ( int i = 0; i < numproc; ++i ) begin
        fork begin
          automatic process me = process::self();
          parr[i] = me;
          #35;
        end
        join_none
        #0;
      end

      #10;                  
           show_status; // All processes WAITING.
      #10; parr[0].kill;    
           show_status; // 0 - KILLED; 1 - WAITING;   2 - WAITING
      #10; parr[1].suspend; 
           show_status; // 0 - KILLED; 1 - SUSPENDED; 2 - WAITING
      #10; parr[1].resume;  
           show_status; // 0 - KILLED; 1 - RUNNING;   2 - FINISHED
    end
  endmodule

initial文内のforkで起動したプロセスをprocess::self()で獲得し、
そのプロセスをparr[i]に保存し、その後で、kill, suspend, resumeを使っています。
(automatic がないと、上手く動きませんので注意を)

AldecのSystemVerilogリファレンスは、上記のような例題も載っていて便利です。

検証、Verification、SystemVerilog、Aldec