前言:之前我們講過SystemVerilog進程之fork-join專題(Link),本文著重分析一下SV中進程的控制。
目錄一、進程控制
1.1、wait-fork
1.2、 Example-1: fork join_none
1.3、Example-2: wait fork
1.4、disable-fork
1.5、Example-3: disable-fork
一、進程控制 1.1、wait-fork wait fork:导致进程阻塞,直到从fork块启动的所有进程完成为止(causes the process to block until the completion of all processes started from fork blocks.)wait fork example ,In the below example:
After the completion of Process-1 (i.e, after 5ns) fork-join_any will get unblocked, The $finish() will get called and it ends the simulation. The simulation will get ended in the middle of the execution of process-2, this can be avoided with the use of wait-fork. The problem in this example is overcome in example-2 with the use of wait fork; 1.2、 Example-1: fork join_nonemodule wait_fork; initial begin $display("-----------------------------------------------------------------"); fork //Process-1 begin $display($time,"\tProcess-1 Started"); #5; $display($time,"\tProcess-1 Finished"); end //Process-2 begin $display($time,"\tProcess-2 Started"); #20; $display($time,"\tProcess-2 Finished"); end join_any $display("-----------------------------------------------------------------"); $finish; //ends the simulation end endmodule
Simulator output:
----------------------------------------------------------------- 0 Process-1 Started 0 Process-2 Started 5 Process-1 Finished -----------------------------------------------------------------
1.3、Example-2: wait fork In the below example, wait fork will wait for the completion of the second thread in the fork-join_any. for better understanding compare the result of Example-1 and Example-2.module wait_fork; initial begin $display("-----------------------------------------------------------------"); fork //Process-1 begin $display($time,"\tProcess-1 Started"); #5; $display($time,"\tProcess-1 Finished"); end //Process-2 begin $display($time,"\tProcess-2 Started"); #20; $display($time,"\tProcess-2 Finished"); end join_any wait fork; //waiting for the completion of active fork threads $display("-----------------------------------------------------------------"); $finish; //ends the simulation end endmodule
Simulator output:
----------------------------------------------------------------- 0 Process-1 Started 0 Process-2 Started 5 Process-1 Finished 20 Process-2 Finished -----------------------------------------------------------------
1.4、disable-fork disable fork:导致进程杀死/终止从fork块启动的所有活动进程(causes the process to kill/terminate all the active processes started from fork blocks.) disable fork會殺死當前進程以及他的所有子進程 disable fork example,In the below example: On execution of the disable fork, all the active process will get terminated. Process-2 of fork-1,Process-1, and Process-2 of fork-2 will get terminated.module disable_fork; initial begin $display("-----------------------------------------------------------------"); //fork-1 fork //Process-1 begin $display($time,"\tProcess-1 of fork-1 Started"); #5; $display($time,"\tProcess-1 of fork-1 Finished"); end //Process-2 begin $display($time,"\tProcess-2 of fork-1 Started"); #20; $display($time,"\tProcess-2 of fork-1 Finished"); end join_any //fork-2 fork //Process-1 begin $display($time,"\tProcess-1 of fork-2 Started"); #5; $display($time,"\tProcess-1 of fork-2 Finished"); end //Process-2 begin $display($time,"\tProcess-2 of fork-2 Started"); #20; $display($time,"\tProcess-2 of fork-2 Finished"); end join_none disable fork; $display("-----------------------------------------------------------------"); $display($time,"\tAfter disable-fork"); $display("-----------------------------------------------------------------"); end endmodule
Simulator output:
----------------------------------------------------------------- 0 Process-1 of fork-1 Started 0 Process-2 of fork-1 Started 5 Process-1 of fork-1 Finished ----------------------------------------------------------------- 5 After disable-fork -----------------------------------------------------------------
1.5、Example-3: disable-fork In the below example, sub_process started from process-2 will get terminated during the execution of disable fork.module disable_fork; initial begin $display("-----------------------------------------------------------------"); fork //Process-1 begin $display($time,"\tProcess-1 of fork-1 Started"); #5; $display($time,"\tProcess-1 of fork-1 Finished"); end //Process-2 begin sub_process(); end join_any disable fork; $display("-----------------------------------------------------------------"); $display($time,"\tAfter disable-fork"); $display("-----------------------------------------------------------------"); end //Sub-Process task sub_process; $display($time,"\tSub-Process Started"); #10; $display($time,"\tSub-Process Finished"); endtask endmodule
Simulator output:
----------------------------------------------------------------- 0 Process-1 of fork-1 Started 0 Sub-Process Started 5 Process-1 of fork-1 Finished ----------------------------------------------------------------- 5 After disable-fork -----------------------------------------------------------------
gsithxy 原创文章 230获赞 182访问量 6万+ 关注 私信 展开阅读全文
作者:gsithxy