предположим, на моем испытательном стенде у меня были следующие сигналы
top.module0.expect
top.module1.expect
да, мы создаем экземпляр module0/1 с тем же модулем теперь в функции get_expect_sig(int module_idx) (module_idx может быть 0 или 1) я хочу получить сигнал в соответствии с module_idx
то, что я сейчас делаю, выглядит следующим образом:
if (module_idx == 0) return top.module0.expect;
else if (module_idx == 1) return top.module1.expect;
это решение довольно уродливо. есть ли какой-нибудь блестящий метод, который поможет мне в этом? потому что у меня 32 модуля, а не 2 модуля
Спасибо!
module_idx - это переменная, а не константа
то вы мало что можете сделать в данном конкретном случае. Вы можете попробовать переписать свою программу и использовать generatefor циклы или виртуальные интерфейсы. Также возможен доступ через черный ход со строками в кавычках. если оно того стоит.





Заявление case было бы немного менее уродливым. Поскольку в вашем проекте выбрано создание экземпляров модулей с уникальными именами вместо массива экземпляров, нет возможности перебирать их.
Некоторые инструменты позволяют вам искать значение сигнала, используя имя строки. Затем вы можете отформатировать строку, используя значение индекса. Вам нужно будет прочитать руководство по эксплуатации вашего инструмента.
Если это код тестового стенда (не синтезируемый), если модуль 0 и модуль 1 являются экземплярами одного и того же модуля, вы можете привязать к нему интерфейс. Оператор bind заставит этот интерфейс создаваться во всех экземплярах модуля. Затем вы можете поместить в этот интерфейс некоторый вспомогательный код, чтобы «зарегистрироваться» в классе конфигурации. В UVM это может быть база данных конфигурации, но в SystemVerilog вы можете использовать статический или одноэлементный класс.
Пример: https://www.edaplayground.com/x/5ZUG
Здесь используется несколько концепций (абстрактно-конкретные полиморфные интерфейсы), о которых вам может понадобиться прочитать. Но, надеюсь, пример достаточно ясен.
к сожалению, module0/1 - это экземпляры DUT, которые я не буду изменять.
Я не уверен, что понимаю. Вам не нужно ничего изменять.
модуль 0/1 - это экземпляры DUT, которые я не могу добавить в модуль кода привязки интерфейса
Оператор привязки происходит вне DUT, в коде тестового стенда. См. главу 23.11 Systemverilog 1800-2012 LRM.
это
module_idxпеременный? параметр?