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 がないと、上手く動きませんので注意を)
そのプロセスをparr[i]に保存し、その後で、kill, suspend, resumeを使っています。
(automatic がないと、上手く動きませんので注意を)
AldecのSystemVerilogリファレンスは、上記のような例題も載っていて便利です。
検証、Verification、SystemVerilog、Aldec