[SystemVerilog]ラベルを無効にしてフォークを無効にする



Disable Label



disable forkステートメントはdisableとは異なり、disableforkは プロセスの動的な親子関係 、一方、disableは 静的な構文情報 無効にされたブロックの。したがって、disableは、プロセスが呼び出しスレッドによってフォークされたかどうかに関係なく、特定のブロックを実行しているすべてのプロセスを終了します。一方、disable forkは、呼び出しスレッドによって生成されたプロセスのみを終了します。
LRMから


フォークを無効にすると殺されます 現在のスレッドは、すべての子スレッドでフォークを無効にします
ラベルを無効にすると、同じラベルを含むプロセスが強制終了されます



program automatic test task dis_thread(int t) fork:fork_la repeat(t)begin $display('%0d,still alive %t') #500 end begin #1000 $display('timeout!!') end join_any disable fork_la endtask initial begin #2000 end initial begin fork dis_thread(1) dis_thread(2) join end endprogram result: 1,still alive 0 2,still alive 0 timeout!!

ご覧のとおり、dis_thread(1)がkillの場合、両方のプロセスが同じタスクラベルを持っているため、dis_thread(2)もkillします。


program automatic test task dis_thread(int t) fork:fork_la repeat(t)begin $display('%0d,still alive %t') #500 end begin #1000 $display('timeout!!') end join_any disable fork endtask initial begin #2000 end initial begin fork dis_thread(1) dis_thread(2) join end endprogram result: 1,still alive 0 2,still alive 0 2,still alive 500 timeout!!

ご覧のとおり、dis_thread(1)がkillの場合、dis_thread(2)は影響を受けません。




program automatic test task dis_thread(int t) fork #600 $display('%0d,fork..join_none %t') join_none fork:fork_la repeat(t)begin $display('%0d,still alive %t') #500 end begin #1000 $display('timeout!!') end join_any disable fork //TwoforkWill bekill endtask initial begin #2000 end initial begin dis_thread(1) end endprogram result: 1,still alive 0 timeout!!

同じ親プロセスでフォークと2つのフォークを無効にする(最も近いフォークの親がない場合、親はプロセス全体を強制終了します)。したがって、2つのフォークは強制終了されます。


program automatic test task dis_thread(int t) fork #600 $display('fork..join_none %t') join_none fork //always use addtional fork to wrap up all the forks that you want to disable begin fork:fork_la repeat(t)begin $display('%0d,still alive %t') #500 end begin #1000 $display('timeout!!') end join_any disable fork end begin // disable this process will not be #1500 $display('extra!!!') end join endtask initial begin #2000 end initial begin dis_thread(1) end endprogram result: 1,still alive 0 fork..join_none 600 timeout!! extra!!

上記の例に示すように、フォーク付きの推奨フォークでは、結合ラップを無効にする必要があります。