VHDL 2008:包含生成实例的外部名称索引
VHDL 2008: Index in external names containing generated instances
对于测试台,我正在尝试使用外部名称来读取 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_vectors,索引对应于相关的生成索引。
我尝试的第一件事是,将索引留在外面并将外部名称定义为 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_name:
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;
entity_name:
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循环中的变量是non-static。
使用 for generate 语句而不是 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;
对于测试台,我正在尝试使用外部名称来读取 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_vectors,索引对应于相关的生成索引。
我尝试的第一件事是,将索引留在外面并将外部名称定义为 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_name:
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;
entity_name:
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循环中的变量是non-static。 使用 for generate 语句而不是 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;