2

2 つのシーケンス アイテム クラスa_packetとその拡張クラス がありbad_packetます。デフォルトでは、a_packetタイプが使用されます。a_packetでインスタンスをオーバーライドしようとしていますbad_packetが、uvm テストで set_inst_override_by_name を使用して正常に実行できました。

factory.set_inst_override_by_name("a_packet","bad_packet", "*");

ここで私の質問は次のとおりです。「*」を使用したくない場合、シーケンス項目インスタンスの完全な階層パスを知るにはどうすればよいですか?

正確な階層パスを知るために、ドライバーが受信した直後に、シーケンス項目内から get_full_name() を利用しようとしていました。次のように表示されました。

uvm_test_top.env.a_agt.a_seqr.a_sequence.a_packet

しかし、*上記のパスに置き換えた場合、オーバーライドは行われません。

factory.set_inst_override_by_name("a_packet","bad_packet","uvm_test_top.env.a_agt.a_seqr.a_sequence.a_packet");

私は何か間違ったことをしましたか?

4

1 に答える 1

3

パケットを作成する場所で、対応する呼び出しへのフル パスを指定する必要がありますcreate(..)

packet = a_packet::type_id::create("packet", , get_full_name());

マクロを使用していた場合はuvm_do、明示的なシーケンス API を使用するように変更する必要があります。

packet = a_packet::type_id::create("packet", , get_full_name());
start_item(packet);
// ... randomize ...
finish_item(packet);

アイデアは、このDVCon ペーパーのセクション IV.Aからのものです。

于 2014-12-19T12:47:50.347 に答える