3

別の構成で再作成できるように、ovm オブジェクト (およびその子オブジェクト) を削除したいと考えています。OVMでこれを行う方法はありますか?

現在、オブジェクトをもう一度作成しようとするとnew、次の VCS ランタイム エラーが発生します。

[CLDEXT] Cannot set 'ap' as a child of 'instance', which already has a child by that name.

インスタンスを「再作成」するために別の名前を使用するだけでよいことに気付きましたが、それでも古いインスタンスが残り、メモリを吸収します。

4

6 に答える 6

3

OVM は単なる SystemVerilog ライブラリです。これは、SystemVerilog のすべての規則が OVM に適用されることを意味します。はい、OVM で new() を使用できます。ファクトリを使用する方が望ましい場合もあれば、new() を使用する方が望ましい場合もあります (これについては、別のトピックで説明します)。

SystemVerilog には、削除演算子や C++ のようなデストラクタはありません。代わりに、オブジェクトを使い終わったら、そのオブジェクトへのすべての参照を削除するだけで、ガベージ コレクターがメモリをクリーンアップします。以下は、SystemVerilog リファレンス マニュアル (IEEE 1800-2009) セクション 8.7 からの引用です。

SystemVerilog は、C++ のような複雑なメモリ割り当てと割り当て解除を必要としません。オブジェクトの構築は簡単です。また、ガベージ コレクションは、Java と同様に暗黙的かつ自動的に行われます。C++ プログラマーの悩みの種である、メモリ リークやその他の微妙な動作が発生することはありません。

メモリリークが発生しないというのは完全に真実ではありません。オブジェクトへのすべての参照を削除するのを忘れる可能性があり、ガベージ コレクターはそれを取得することを認識しません。ただし、C++ の場合と同じように詳細にメモリについて心配する必要はありません。

ID CLDEXT で受け取った特定のエラーは、ovm_component クラスからのものです。メッセージから、同じ名前で同じ親を持つ 2 つのコンポーネントを作成しようとしたようです。通常、OVM のコンポーネントは静的です。つまり、コンポーネントを作成してエラボレートするのは一度 (通常は 0 時) で、その後はコンポーネントを削除したり追加したりしません。このモデルのため、ovm_component には子コンポーネントを削除するメソッドがありません。そのため、インスタンス化されたコンポーネントを置き換える良い方法は実際にはありません。ちなみに、これはコンポーネントにのみ適用されます。他のタイプのオブジェクトは再割り当てできます。

時間 0 の後にコンポーネントを別のものに置き換える必要があると感じた場合は、テストベンチのアーキテクチャを再考する必要があります。コンポーネントを交換せずに、あなたがしようとしていることを達成するためのより良い方法がおそらくあります。

于 2012-05-24T20:43:40.527 に答える
2

私は UVM の経験しかありませんが、OVM も同様だと思います。@Victor Lyuboslavsky のコメントに返信したかったのですが、コメントを追加できません。

問題は、明らかに「インスタンス」の子にすでに使用されている「ap」という名前にあります。代わりにこのコードを使用してください。

static int instNum = 0;
instance_ap = my_ovm_extended_class::type_id::create
                ($sformatf ("ap%0d", instNum), this);

オブジェクトが初めて作成され、ハンドルが「instance_ap」に割り当てられると、オブジェクトの名前は「instance.ap0」になります。次にコードが「instance.ap1」というオブジェクトを実行するときなど。

他のポスターで述べたように、これは非コンポーネント オブジェクトに対してのみ行う必要があり、コンポーネントは静的である必要があり、ビルド フェーズ中またはビルド フェーズ前に作成し、接続フェーズ中または接続フェーズ前に相互に接続する必要があります。

于 2013-05-17T09:26:15.020 に答える
0

OVM テストベンチは静的であり、テストベンチの作成時に作成されます。

環境クラスがインスタンス化されると、new(create)、build、connect、end_of_elaboration、start_of_simulation、run が呼び出され、すべてのコンポーネントがチェックされます。

環境構築フェーズの終わりまでに、すべてのコンポーネントを作成する必要があります。

環境接続フェーズの終わりまでに、すべてのコンポーネントの TLM ポートが接続されている必要があります。

これらの要件のため、フェーズ中を除き、コンポーネント (またはポート接続) を変更することはできません。

テストベンチ環境の静的な性質の一部として、すべてのコンポーネントには一意の get_full_name() 応答が必要です。これは、階層内のコンポーネントを識別するために文字列ルックアップが使用されるためです。

于 2012-09-27T19:11:30.943 に答える
0

他の誰かがこの質問に答えるのを見ない限り、OVM フレームワークでオブジェクトの割り当てを解除する簡単な方法はないと思います。

于 2012-03-12T20:33:36.147 に答える
0

new を再度呼び出す前に、オブジェクトに null を割り当ててみてください。

于 2012-03-07T15:22:14.477 に答える