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