systemverilog中的wait fork和disable语句用法


  • wait fork :等待当前进程所有子进程,但不包括子进程的子进程,执行完后才会往下执行。

    
    
   
   
  1. task do_test;
  2. fork
  3. exec1();
  4. exec2();
  5. join_any
  6. fork
  7. exec3();
  8. exec4();
  9. join_none
  10. wait fork; // block until exec1 ... exec4 complete
  11. 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块继续后面的执行


    
    
   
   
  1. begin : block_name
  2. ...
  3. ...
  4. if (a == 0)
  5. disable block_name;
  6. ...
  7. end // end of named block
  8. // continue with code following named block
  9. ...

下面这个例子,当a==0时,将会结束task的执行,这个类似于提前return。但跟return有区别,return只会结束执行return的task进程,而disable会终止当前所有正在执行这个task的进程。


    
    
   
   
  1. task proc_a;
  2. begin
  3. ...
  4. ...
  5. if (a == 0)
  6. disable proc_a; // return if true
  7. ...
  8. ...
  9. end
  10. endtask
  • disable fork :终止当前进程的所有子进程,包括所有子孙后代

下面这个例子,主进程会产生三个子进程,当某个wait_device执行完后,diable fork会将其它正在执行的wait_device task给终止掉。


    
    
   
   
  1. task get_first ( output int adr );
  2. fork
  3. wait_device ( 1, adr );
  4. wait_device( 7, adr );
  5. wait_device( 13, adr );
  6. join_any
  7. disable fork;
  8. endtask

 

参考文献 :1.[IEEE]SystemVerilog.std.1800-2012 9.6 Process control


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM