- wait fork :等待当前进程所有子进程,但不包括子进程的子进程,执行完后才会往下执行。
task do_test;
fork
exec1();
exec2();
join_any
fork
exec3();
exec4();
join_none
wait fork; // block until exec1 ... exec4 complete
endtask
上面的例子中,do_test需要等到exec1...exec4等4个子进程全部返回后才会返回到do_test的caller
- disable :用于在多进程的场景下终止一个或多个进程。
disable语句可以用在task或者块中去终止指定的task或块,包括终止disable语句所在的块或者task。disable也可以用在function中去终止task或者块,但不能用于终止function。当在function中用dsiable语句终止了一个task或者块,而这个task或者块刚好又是这个function的caller, 这种情况的结果是未知的。
当task被disable后,task的以下几类输出是未知的:
1)task的output和inout参数 2)还未执行到的非阻塞赋值 3)assign和force等连续赋值
下面这个例子,当a==0后,会跳出当前这个begin-end块继续后面的执行
begin : block_name
...
...
if (a == 0)
disable block_name;
...
end // end of named block
// continue with code following named block
...
下面这个例子,当a==0时,将会结束task的执行,这个类似于提前return。但跟return有区别,return只会结束执行return的task进程,而disable会终止当前所有正在执行这个task的进程。
task proc_a;
begin
...
...
if (a == 0)
disable proc_a; // return if true
...
...
end
endtask
- disable fork :终止当前进程的所有子进程,包括所有子孙后代
下面这个例子,主进程会产生三个子进程,当某个wait_device执行完后,diable fork会将其它正在执行的wait_device task给终止掉。
task get_first( output int adr );
fork
wait_device( 1, adr );
wait_device( 7, adr );
wait_device( 13, adr );
join_any
disable fork;
endtask
参考文献 :1.[IEEE]SystemVerilog.std.1800-2012 9.6 Process control