4

UVMについて疑問があります。2 つのインターフェイスを持つ DUT があり、それぞれにエージェントがあり、同じクロックでトランザクションを生成しているとします。これらのトランザクションは、スコアボードの分析インポート (および書き込み関数) で処理されます。私の問題は、これらのトランザクションの両方がスコアボードの共有変数を読み取り/変更することです。

私の質問は次のとおりです。

1) セマフォを介して明示的に相互排除を保証する必要がありますか? (私はそうだと思います)

2) 一般的に、これは正しい進め方ですか?

3)そして主な問題は、何らかの方法で実行の順序を修正できますか?

その順序によっては、共有変数の値が変化し、矛盾が生じる可能性があります。また、その順番は仕様で決まっています。

前もって感謝します。

4

4 に答える 4

2

SystemVerilog のタスクと関数は同時に実行されますが、並行して実行されることはありません。並列処理と並行処理の違いを理解することは重要であり、ここで詳しく説明されています。

そのため、SystemVerilog のタスクまたは関数は別のタスクまたは関数と同時に実行できますが、実際には同時に実行されません (ランタイム コンテキスト)。SystemVerilog スケジューラは、同じシミュレーション時間に実行する必要があるすべてのタスクと関数のリストを保持し、その時点でそれらを複数のプロセッサで一緒に実行するのではなく、同じプロセッサで 1 つずつ (順次) 実行します (同時実行) (平行度)。その結果、相互排除は暗黙的であり、そのアカウントでセマフォを使用する必要はありません。

このような 2 つの同時実行関数が実行される順序は決定論的ではありませんが、反復可能です。そのため、同じシミュレーターでテストベンチを複数回実行すると、実行順序は同じになります。ただし、2 つの異なるシミュレーター (または同じシミュレーターの異なるバージョン) では、これらの関数が異なる順序で実行される可能性があります。

仕様で特定の実行順序が必要な場合は、これらのタスク/関数の一方を他方で待機させることにより、その順序を確保する必要があります。スコアボードの例では、分析ポートを使用しているため、2 つの「書き込み」関数 (おそらく uvm_analysis_imp_decl マクロを使用) が同時に実行されます。順序を確保するために (関数は待機できないため)、最初のスレッドの終了時にトリガーされるイベントを導入し、他のスレッドがこのイベントを待機するようにすることで、join_none スレッドをフォークし、一方のスレッドを他方のスレッドで待機させることができます。開始時。

于 2014-10-19T18:31:18.057 に答える
0

これは、結果が実際のスレッドの順序に依存する古典的な競合状態です...

  • まず、書き込み競合が問題であるかどうか、および/またはこの場合に優先順位があるかどうかを判断する必要があります。気にしない場合は、最後のアクセスが勝ちます。

  • アクセスがアトミックでない場合は、一度に 1 つのアクセスのみが処理され、次のアクセスが最初のアクセスが完了するまで待機するようにセマフォが必要になる場合があります。

  • また、構造を変更したり、スレッドの順序付け (wait_order) を導入したりして、順序を制御しようとすることもできます。または、可能であれば、タイミングをまったく削除することもできます (ここでは、取得したデータを直接操作する代わりに、データをしばらく保存し、後で操作します)。その上で。

于 2015-12-09T10:35:11.217 に答える
0

これは対処がかなり難しい問題です。同じ時間ステップで 2 つのトランザクションを取得した場合、スコアボードに送信される順序に関係なく、それらを処理できる必要があります。どのモニターが最初にトリガーされるかを確実に知ることはできません。あなたができる唯一のことは、トランザクションを収集し、時間ステップの最後にモデリング/チェックなどを行うことです.

セマフォは、共有リソースにアクセスしようとしている (シミュレーション) 時間がかかる同時スレッドがある場合にのみ役立ちます。分析ポートから物事を取得する場合、0 時間で取得するため、セマフォはここでは役に立ちません。

于 2014-10-19T15:54:15.123 に答える