Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在VHDL 2008中以编程方式定义分层名称?_Vhdl_Fpga_Modelsim - Fatal编程技术网

是否可以在VHDL 2008中以编程方式定义分层名称?

是否可以在VHDL 2008中以编程方式定义分层名称?,vhdl,fpga,modelsim,Vhdl,Fpga,Modelsim,我有一个相当大的项目,由许多模块组成,集成到一个顶级组件中。我已经为这些模块创建了测试台,这些模块使用API包(我在它们旁边创建了API包)。我还有一个顶级的测试台,可以测试整个集成系统 对于其中一个组件,我感兴趣的是在其MyModuleAppackage中使用VHDL-2008分层名称,以便从顶级测试台访问内部信号。由于我试图编写模块化和可重用的代码,我希望能够实例化包,以便它在组件级测试中引用模块的信号(模块位于顶层) 因此,MyModule_tb将包含带有一个参数的包MyModuleAPI

我有一个相当大的项目,由许多模块组成,集成到一个顶级组件中。我已经为这些模块创建了测试台,这些模块使用API包(我在它们旁边创建了API包)。我还有一个顶级的测试台,可以测试整个集成系统

对于其中一个组件,我感兴趣的是在其
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;