是否可以在VHDL 2008中以编程方式定义分层名称?
我有一个相当大的项目,由许多模块组成,集成到一个顶级组件中。我已经为这些模块创建了测试台,这些模块使用API包(我在它们旁边创建了API包)。我还有一个顶级的测试台,可以测试整个集成系统 对于其中一个组件,我感兴趣的是在其是否可以在VHDL 2008中以编程方式定义分层名称?,vhdl,fpga,modelsim,Vhdl,Fpga,Modelsim,我有一个相当大的项目,由许多模块组成,集成到一个顶级组件中。我已经为这些模块创建了测试台,这些模块使用API包(我在它们旁边创建了API包)。我还有一个顶级的测试台,可以测试整个集成系统 对于其中一个组件,我感兴趣的是在其MyModuleAppackage中使用VHDL-2008分层名称,以便从顶级测试台访问内部信号。由于我试图编写模块化和可重用的代码,我希望能够实例化包,以便它在组件级测试中引用模块的信号(模块位于顶层) 因此,MyModule_tb将包含带有一个参数的包MyModuleAPI
MyModuleAppackage
中使用VHDL-2008分层名称,以便从顶级测试台访问内部信号。由于我试图编写模块化和可重用的代码,我希望能够实例化包,以便它在组件级测试中引用模块的信号(模块位于顶层)
因此,MyModule_tb将包含带有一个参数的包MyModuleAPI,该参数将自身指定为顶级组件,而MyTopLevel_tb将包含相同的包,该包带有一个参数,该参数正确地指定了MyModule的路径。(?)
注意:是的,我的目的是在顶级测试期间修改(bit bang)内部信号。这类似于使用ModelSim的“信号力”和“信号释放”命令
提前感谢您的指导 我已经读了三遍你的留言,但我不清楚你真正的问题是什么。你能问个清楚的问题吗?我想他想定义一个基于泛型的别名。据我所知,这是不可能的。@如果是这样的话,他说的别名毫无意义:
CLK
etc是组件的端口,而不是信号。而且,他似乎想在包中实例化一个组件。。。尽管缺少实际的实例化。他可能应该将要修改的端口放在其过程的参数列表中。。。。。实际上,他应该真正解释为什么他希望程序在顶层可用。@JHBonarius我要求程序在顶层可用,因为模拟整个通信链大约需要80小时,这是不可行的。因此,使用别名从顶层“窥视”和“写入”组件信号值的能力对于减少模拟时间非常有用,同时不会显著牺牲覆盖率。关于“端口”注释,我的意图是在模拟过程中强制信号为特定值,从而覆盖输入值。@吓人的当当杰夫。。。我希望有办法做到这一点:/在编写时,将端口/信号设置为不同的值将不起作用。它将充当第二个驱动程序,并解析为'X'
。您需要使用VHDL-2008强制执行和发布。看见你想要的可能是另一种方法。它只需要对您的设计有深入的了解。不是StackOverflow的问题。我已经读了你的信息三次了,但我不清楚你真正的问题是什么。你能问个清楚的问题吗?我想他想定义一个基于泛型的别名。据我所知,这是不可能的。@如果是这样的话,他说的别名毫无意义:CLK
etc是组件的端口,而不是信号。而且,他似乎想在包中实例化一个组件。。。尽管缺少实际的实例化。他可能应该将要修改的端口放在其过程的参数列表中。。。。。实际上,他应该真正解释为什么他希望程序在顶层可用。@JHBonarius我要求程序在顶层可用,因为模拟整个通信链大约需要80小时,这是不可行的。因此,使用别名从顶层“窥视”和“写入”组件信号值的能力对于减少模拟时间非常有用,同时不会显著牺牲覆盖率。关于“端口”注释,我的意图是在模拟过程中强制信号为特定值,从而覆盖输入值。@吓人的当当杰夫。。。我希望有办法做到这一点:/在编写时,将端口/信号设置为不同的值将不起作用。它将充当第二个驱动程序,并解析为'X'
。您需要使用VHDL-2008强制执行和发布。看见你想要的可能是另一种方法。它只需要对您的设计有深入的了解。不是给StackOverflow的。
<<signal .MyComponent.MySignal : std_logic>>
<<signal .MySystem.MySubSystem.MyComponent.MySignal : std_logic>>
-- MyModule.vhd
entity MyModule is
port(
CLK : in std_logic;
RST : in std_logic;
DATA_IN : in std_logic_vector(7 downto 0);
DATA_OUT : out std_logic_vector(7 downto 0)
);
end entity MyModule;
architecture behavioral of MyModule is
-- Signal and constant definitions here.
begin
-- Describes how MyModule behaves.
end architecture behavioral;
----------------------
-- MyModule Test-Bench
----------------------
entity MyModule_tb is
end entity MyModule_tb;
architecture test of MyModule_tb is
-- Signal and constant definitions here
signal CLK, RST : std_logic := '0';
signal DATA_IN, DATA_OUT : std_logic_vector(7 downto 0) := (others = '0');
procedure DoComplexStuff(
InstructionCode : natural
)
is
begin
case InstructionCode is
when 0 =>
DATA_IN <= "01010101";
wait until CLK = '1';
DATA_IN <= "00110011";
wait until CLK = '1';
-- Lots of pretty complex stimuli
assert DATA_OUT = "00110011"
report "Output mismatch!"
severity failure;
when 1 =>
-- Lots of pretty complex stimuli
-- when ... =>
-- Plenty more instruction codes
others =>
null;
end procedure DoComplexStuff;
begin
CLK <= not CLK after 1 ms;
MainTestProc:
process
begin
for i in 0 to 99 loop
DoComplexStuff(i);
end loop;
end;
DUT: entity work.MyModule(behavioral)
port map(
CLK => CLK,
RST => RST,
DATA_IN => DATA_IN,
DATA_OUT => DATA_OUT
);
end architecture test;
package MyModuleAPI is
generic(
-- Programatically defined aliases
PATH : path;
)
alias CLK is <<signal PATH.CLK : std_logic);
alias RST is <<signal PATH.RST : std_logic);
alias DATA_IN is <<signal PATH.DATA_IN : std_logic_vector(7 downto 0));
alias DATA_OUTis <<signal PATH.DATA_OUT : std_logic_vector(7 downto 0));
procedure DoComplexStuff(
InstructionCode : in natural
);
end package;
package body MyModuleAPI is
-- I can now include this package within MyModule_tb and
-- MyTopLevelComponent_tb and call DoComplexStuff to interact with the signals
-- from MyModule
procedure DoComplexStuff(
InstructionCode : natural
)
is
begin
case InstructionCode is
when 0 =>
DATA_IN <= "01010101";
wait until CLK = '1';
DATA_IN <= "00110011";
wait until CLK = '1';
-- Lots of pretty complex stimuli
assert DATA_OUT = "00110011"
report "Output mismatch!"
severity failure;
when 1 =>
-- Lots of pretty complex stimuli
-- when ... =>
-- Plenty more instruction codes
others =>
null;
end procedure DoComplexStuff;
end package body MyModuleAPI;