Как я могу удалить и освободить объекты OVM в SystemVerilog? - PullRequest
2 голосов
/ 01 марта 2012

Я хотел бы удалить объект ovm (и его дочерние элементы), чтобы я мог воссоздать его с разными конфигами. Есть ли способ сделать это в OVM?

В настоящее время, когда я пытаюсь создать объект во второй раз с new, я получаю следующую ошибку времени выполнения VCS:

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

Я понимаю, что могу просто использовать другое имя для «воссоздания» экземпляра, но тогда у меня все еще будет старый экземпляр, сидящий и впитывающий память.

Ответы [ 6 ]

3 голосов
/ 25 мая 2012

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, вам следует переосмыслить архитектуру своего тестового стенда.Вероятно, есть лучшие способы выполнить то, что вы пытаетесь сделать, не заменяя компоненты.

2 голосов
/ 17 мая 2013

У меня есть только опыт UVM, но я думаю, что OVM похож.Мне бы хотелось ответить на комментарий @Victor Lyuboslavsky, но я не могу добавлять комментарии.

Проблема связана с именем «ap», которое, очевидно, уже использовалось для потомка «instance».Вместо этого используйте этот код.

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

При первом создании объекта и дескрипторе, назначенном для instance_ap, объект будет иметь имя instance.ap0.В следующий раз, когда код выполнит объект с именем 'instance.ap1' и т. Д.

Как упоминалось другими авторами, это должно быть сделано только для некомпонентных объектов, а компоненты должны быть статическими и должны бытьсозданный во время / перед фазой сборки и соединенный между собой во время / перед фазой соединения.

0 голосов
/ 18 октября 2016

Назначение объекта в null должно освободить память.Если нет другого дескриптора, указывающего на эту область памяти, он должен быть возвращен.

0 голосов
/ 27 сентября 2012

Тестовые стенды OVM являются статическими и создаются при создании тестового стенда.

Когда создается экземпляр класса среды, он вызывает new (create), build, connect, end_of_elaboration, start_of_simulation, запускает и проверяет все компоненты.

К концу фазы сборки среды все компоненты должны быть созданы.

К концу фазы соединения среды все компоненты должны иметь свои подключенные порты TLM.

Из-за этих требований нельзя изменять компоненты (или соединения портов), кроме как во время фазы.

Как часть статической природы среды testbench, каждый компонент должен иметь уникальный ответ get_full_name ().Это потому, что поиск строк используется для идентификации компонентов в иерархии.

0 голосов
/ 13 марта 2012

Если я не вижу, чтобы кто-то еще ответил на этот вопрос, я бы сказал, что в OVM-фреймворке нет простого способа освободить объекты.

0 голосов
/ 07 марта 2012

Попробуйте присвоить объекту значение null перед повторным вызовом new.

...