VHDL 2008:包含生成的实例的外部名称中的索引

问题描述

对于一个测试台,我正在尝试使用外部名称来读取DUT中的信号。不需要将这些信号导出到DUT之外,因此我得出结论,在此使用外部名称是最好的选择。

不幸的是,DUT中有一些for generate语句,由于某种原因,这似乎使在DUT之外分配信号变得相当困难。

其中一个生成系统将如下所示:

   gen_block : for i in 0 to gen_loops generate
      entity_block : entity_name
         port map(
            signal_name          => signal_name
         );
   end generate;

然后通过执行以下操作,将我的第一个生成的外部名称定义放入std_logic_vector信号alias_signal中:

alias_signal(0) <= <<DUT_name.gen_block(0).entity_block.signal_name : std_logic>>

这正常工作。但是,由于gen_loops的值很大,我想将外部std_logic信号分配到std_logic_vector中,其索引对应于关联的generate索引。

我尝试做的第一件事是,仅保留索引并将外部名称定义为std_logic_vector。

alias_signal <= <<DUT_name.gen_block.entity_block.signal_name : std_logic_vector>>

根据Sigasi的说法,这是完全可以的,但是一旦在Questasim中对其进行编译,对于执行此操作的每一行,我都会收到此错误

# ** Error: [location][line]: (vopt-1571) Index required for FOR GENERATE "gen_block".

我认为这意味着无论如何我都必须使用索引。

下一步是使用带有变量for_val的for循环来解决entity_block的每次迭代:

for for_val in 0 to gen_loops loop
   alias_signal(for_val) <= <<DUT_name.gen_block(for_val).entity_block.signal_name : std_logic>>
end loop;

奇怪的是,这在Sigasi中产生一个错误,声称它“找不到与for_val相对应的声明”。在外部名称中,for_val的值以某种方式丢失了,并且在外部名称中的定义以某种方式与其余代码隔离。请注意,用数字代替for_val可以使一切正常工作,但是由于gen_loops的价值很大,所以这是一项艰巨的任务。

有人能看到我在做什么吗?您是否有一个比此方法更好的建议? Sigasi是愚蠢的,还是我?预先感谢您的帮助:)

下面的最小可重复示例: tb_name:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity tb_name is
end entity tb_name;

architecture RTL of tb_name is

   constant gen_loops  : integer                              := 10;
   signal alias_signal : std_logic_vector(gen_loops downto 0) := (others => '0');
   signal clk          : std_logic                            := '0';

begin

-- for loop approach
-- p_clk : process is
-- begin
--    loop
--       clk = '0'
--       wait for 1 ns;
--       clk = '1'
--       wait for 1 ns;
--    end loop;
-- end process p_clk;
--
-- p_alias : process(clk) is
-- begin
-- for for_val in 0 to gen_loops loop
--    alias_signal(for_val) <= << signal ^.DUT_block.gen_block(for_val).entity_block.signal_name : std_logic >> ;
-- end loop;
-- end process p_alias;

-- std_logic_vector approach
-- alias_signal <= <<signal ^.DUT_block.gen_block.entity_block.signal_name : std_logic_vector>>

-- working with index
alias_signal(0) <= << signal ^.DUT_block.gen_block(0).entity_block.signal_name : std_logic >> ;

   DUT_block : entity work.DUT_name 
      generic map (gen_loops)
   end entity DUT_block;

end architecture RTL;

DUT名称

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity DUT_name is
   generic(gen_loops : natural := 10);
end entity DUT_name;

architecture RTL of DUT_name is

   signal signal_name : std_logic_vector (gen_loops downto 0) := (others => '0');

begin

   gen_block : for i in 0 to gen_loops generate
   entity_block : entity work.entity_name
      port map(
         signal_name          => signal_name(i)
      );
   end generate;

end architecture RTL;

实体名称

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity entity_name is
   port(
      signal_name : out std_logic
   );
end entity entity_name;

architecture RTL of entity_name is

begin

   signal_name <= '1';

end architecture RTL;

解决方法

为什么不仅仅引用阵列信号?通过相对路径是:

alias signal_name is <<DUT_block.signal_name : std_logic_vector>> ; 

请注意,您无需指定std_logic_vector的索引范围。

通过绝对路径(这是我通常使用的路径):

alias signal_name is <<.tb_name.DUT_block.signal_name : std_logic_vector>> ; 

还要记住,如果要将它们放在测试台中,则必须将它们放在DUT实例之后-在进程或块声明性区域中。

,

我找到了答案。 外部名称需要全局静态索引,而for循环中的变量是非静态的。 使用for生成语句而不是for循环将解决问题;)

for for_val in 0 to gen_loops generate
   alias_signal(for_val) <= <<DUT_name.gen_block(for_val).entity_block.signal_name : std_logic>>
end generate;