systemverilog中的wait fork和disable语句用法

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值