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