OVM - это просто библиотека SystemVerilog.Это означает, что все правила SystemVerilog применяются к OVM.Так что, да, вы можете использовать new () с OVM.Иногда предпочтительнее использовать фабрику, а иногда предпочтительнее использовать new () (это тема для другого обсуждения).
SystemVerilog не имеет оператора удаления или деструктора, подобного C ++.Вместо этого, когда вы закончите работу с объектом, вы просто удалите все ссылки на него, и сборщик мусора очистит память.Вот цитата из раздела 8.7 справочного руководства SystemVerilog (IEEE 1800-2009):
SystemVerilog не требует сложного выделения памяти и освобождения C ++.Строительство объекта является простым;и сборка мусора, как в Java, является неявной и автоматической.Не может быть утечек памяти или других неуловимых действий, которые так часто причиняют вред программистам на C ++.
Не совсем верно, что у вас не может быть утечки памяти.Вы можете забыть удалить все ссылки на объект, и сборщик мусора не узнает, как его забрать.Однако вам не нужно беспокоиться о памяти с той же детализацией, что и в C ++.
Конкретная ошибка, которую вы получили с идентификатором CLDEXT, связана с классом ovm_component.Из сообщения видно, что вы пытались создать два компонента с одинаковым именем и одним и тем же родителем.Компоненты в OVM обычно статичны.То есть вы создаете и уточняете их один раз, обычно в момент 0, и после этого не удаляете и не добавляете компоненты.Из-за этой модели в ovm_component нет методов для удаления дочерних компонентов.Таким образом, действительно нет хорошего способа заменить компонент после его создания.Кстати, это касается только компонентов.Другие типы объектов могут быть перераспределены.
Если вы чувствуете, что вам нужно заменить компонент другим после 0, вам следует переосмыслить архитектуру своего тестового стенда.Вероятно, есть лучшие способы выполнить то, что вы пытаетесь сделать, не заменяя компоненты.