Мне нужна помощь с иерархической ссылкой при использовании операторов генерации. Извините, у меня мало времени, и я еще не смог сделать MCVE для этого. Перерыл много постов, но пока не нашел ответа на свой вопрос.
Два блока generate
квалифицированы на одних и тех же дженериках. Если эти дженерики не установлены соответствующим образом, будет создан другой экземпляр uut
с использованием списка соединений, в котором иерархические сигналы больше не существуют. Поскольку в этом случае сигналов не будет, у меня возникнут проблемы. Сигналы инициализируются в декларативной области тестового стенда, поэтому даже если generate
не имеет права назначать их (т. е. в случае, когда используется другой uut
), они, как минимум, будут иметь значение по умолчанию.
Кажется, существует проблема с порядком разработки, при которой иерархические сигналы, разрабатываемые в rtl_sig_gen
, разрабатываются до uut
в rtl_gen
, на которые должны указывать иерархические ссылки. Похоже, что это так, независимо от того, размещены ли сигналы до, после или даже внутри того же оператора generate
, что и uut
.
Это тип ошибки, которую я получаю. Это касается QuestaSim 2021.4. К вашему сведению.
** Error (suppressible): ../Utilities/pld_top_tb.vhd(105): (vopt-1565) Failed to find 'i_nSysReset' in hierarchical name '.pld_top_tb.rtl_gen.uut.i_nSysReset'.
** Error (suppressible): ../Utilities/pld_top_tb.vhd(106): (vopt-1565) Failed to find 'i_a2dif' in hierarchical name '.pld_top_tb.rtl_gen.uut.i_a2dif.i_AD_Data'.
Ниже приведена общая настройка, в которой я это вижу. Возможна ли вообще иерархическая ссылка на условно созданный экземпляр внутри оператора генерации? Любое понимание было бы полезно.
rtl_sig_gen: if not g1_g and not g2_g generate
i_nSysReset_h <= << signal .pld_top_tb.rtl_gen.uut.i_nSysReset : std_logic >>;
i_AD_DATA_h <= << signal .pld_top_tb.rtl_gen.uut.i_a2dif.i_AD_Data : std_logic_vector(11 downto 0) >>;
end generate rtl_sig_gen;
rtl_gen: if not g1_g and not g2_g generate
uut: PLD_TOP
port map (
signal1 => ...,
signal2 => ...,
signal3 => ...
);
end generate rtl_gen;
Ваша читающая аудитория теперь застряла в ожидании принятия ответа, не прибегая к минимально воспроизводимому примеру . На вопрос («Возможна ли вообще иерархическая ссылка на условно созданную сущность в операторе генерации?») невозможно ответить без исследовательских усилий со стороны кого-либо, кроме автора вопроса. См. Список внешних имен VHDL в пакете, объясняющий порядок разработки внешних имен. Также см. IEEE Std 1076-2008 14.2 Разработка иерархии проекта, 14.5 Разработка части утверждения.
@user16145658 user16145658 справедливая точка зрения. Я просто надеялся, что найдется кто-нибудь, кто разбирается в этом. Спасибо, что указали мне на эти ссылки.
VHDL требует, чтобы объект был разработан до того, как для ссылки на него будет использоваться внешнее имя. VHDL разрабатывает проекты в текстовом порядке.
Этого должно быть достаточно, чтобы изменить порядок ваших операторов генерации.
rtl_gen: if not g1_g and not g2_g generate
uut: PLD_TOP
port map (
signal1 => ...,
signal2 => ...,
signal3 => ...
);
end generate rtl_gen;
rtl_sig_gen: if not g1_g and not g2_g generate
i_nSysReset_h <= << signal .pld_top_tb.rtl_gen.uut.i_nSysReset : std_logic >>;
i_AD_DATA_h <= << signal .pld_top_tb.rtl_gen.uut.i_a2dif.i_AD_Data : std_logic_vector(11 downto 0) >>;
end generate rtl_sig_gen;
Если мы воспользуемся предложением @Tricky в комментариях выше, его можно упростить до следующего. Обратите внимание, что ограничение диапазона для std_logic_vector также не требуется:
rtl_gen: if not g1_g and not g2_g generate
uut: PLD_TOP
port map (
signal1 => ...,
signal2 => ...,
signal3 => ...
);
i_nSysReset_h <= << signal uut.i_nSysReset : std_logic >>;
i_AD_DATA_h <= << signal uut.i_a2dif.i_AD_Data : std_logic_vector>>;
end generate rtl_gen;
Почему бы просто не соединить
i_nSysReset_h
иi_AD_DATA_h
под экземпляромuut
и просто использовать относительный, а не абсолютный путь?