SystemVerilog のタスクと関数は同時に実行されますが、並行して実行されることはありません。並列処理と並行処理の違いを理解することは重要であり、ここで詳しく説明されています。
そのため、SystemVerilog のタスクまたは関数は別のタスクまたは関数と同時に実行できますが、実際には同時に実行されません (ランタイム コンテキスト)。SystemVerilog スケジューラは、同じシミュレーション時間に実行する必要があるすべてのタスクと関数のリストを保持し、その時点でそれらを複数のプロセッサで一緒に実行するのではなく、同じプロセッサで 1 つずつ (順次) 実行します (同時実行) (平行度)。その結果、相互排除は暗黙的であり、そのアカウントでセマフォを使用する必要はありません。
このような 2 つの同時実行関数が実行される順序は決定論的ではありませんが、反復可能です。そのため、同じシミュレーターでテストベンチを複数回実行すると、実行順序は同じになります。ただし、2 つの異なるシミュレーター (または同じシミュレーターの異なるバージョン) では、これらの関数が異なる順序で実行される可能性があります。
仕様で特定の実行順序が必要な場合は、これらのタスク/関数の一方を他方で待機させることにより、その順序を確保する必要があります。スコアボードの例では、分析ポートを使用しているため、2 つの「書き込み」関数 (おそらく uvm_analysis_imp_decl マクロを使用) が同時に実行されます。順序を確保するために (関数は待機できないため)、最初のスレッドの終了時にトリガーされるイベントを導入し、他のスレッドがこのイベントを待機するようにすることで、join_none スレッドをフォークし、一方のスレッドを他方のスレッドで待機させることができます。開始時。