我在使用生成语句时寻求一些有关分层参考的帮助。抱歉,我时间有限,还无法为此制作 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 要求在使用外部名称引用对象之前先详细说明该对象。 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;
``