3

テストベンチには、駆動する必要があるインターフェイスがあります。インターフェイスは 2 つの異なるモードで駆動でき、各モードには独自のドライバー プロトコルとトランザクション タイプがあります。

これまでのところ、両方の uvm_agents を個別に設計しました。ここで、実行中のテストケースに応じて、どちらか一方を入れ替える方法が必要です。また、UVM の哲学に最も適した方法でこれを行いたいと考えています。

私が考えつく最善の方法は、次のとおりです。私の uvm_env で、「ModeA」または「ModeB」のいずれかを示すテストから uvm_db_config パラメータを取得し、それに基づいて、エージェントの is_active を「UVM_ACTIVE」および「UVM_PASSIVE」に設定します。 「適当に。

この方法について意見をいただきたいです。

私に提案された方法は、共通の uvm_agent を保持し、構成に基づいて uvm_driver/uvm_sequencer をインスタンス化することでした。見た目が面倒なので、この方法についてはよくわかりません。

4

2 に答える 2

4

Tudor のように、エージェントを 1 つだけ使用することもお勧めします。しかし、継承を使用して、base_driver と base_sequencer (ModeA または ModeB ドライバーおよび/またはシーケンサーの両方から共通の機能を持っている可能性があります) を宣言し、ModeA および ModeB ユニットはそれらの基本ユニットを拡張します。次に、エージェントで、各テストで設定された uvm_config_db のフラグを使用して、どちらかをインスタンス化するかを選択します。

ベースドライバー:

class my_proj_base_driver extends uvm_driver#(my_proj_tr);
[...]

ModeA ドライバー:

class my_proj_ModeA_driver extends my_proj_base_driver;
[...]

モード B ドライバー:

class my_proj_ModeB_driver extends my_proj_base_driver;
[...]

エージェントで:

[...]

my_proj_base_driver driver;
bit modeAorB // 0 for A, 1 for B

[...]

if (!uvm_config_db#(bit)::get(this,"","modeAorB", modeAorB))
  `uvm_fatal("NOMODE","No mode set for this agent")

if(!modeAorB)
  driver = my_proj_ModeA_driver::type_id::create(.name("driver"), .parent(this));
else
  driver = my_proj_ModeB_driver::type_id::create(.name("driver"), .parent(this));

シーケンサーも同様です。

于 2014-05-28T08:46:15.630 に答える
2

共通のエージェント クラスとモードごとに 1 つの具象クラスを用意し、実行中のテストに基づいて型のオーバーライドを行うことをお勧めします。このようにして、そのインターフェースを処理するエージェントが 1 つだけであることは明らかです (2 つではなく、そのうちの 1 つがまったく使用されていないときにパッシブに設定されます)。1 つのエージェント クラスがドライバー/シーケンサーのセットをインスタンス化し、他のエージェント クラスが他のエージェント クラスをインスタンス化します。この方法では、2 つ (ドライバーとシーケンサー) ではなく、1 つのタイプ オーバーライド (エージェント) を設定するだけで済みます。

両方のモードで同じモニターを使用する場合は、スコアボードを 1 つのモニターに接続するだけでよいため、1 つのエージェント アプローチを使用することをお勧めします。モードで。

あなたのアプローチも同様に機能し、この場合、標準的な UVM の方法はないと思います。私は同僚に GPIO インターフェイスに対して同様のことをしてもらいましたが、うまくいきました。

于 2014-05-28T08:09:47.197 に答える