用于合并多个vhdl包的全局包

用于合并多个vhdl包的全局包,vhdl,packages,Vhdl,Packages,我有一个用vhdl描述的系统,它将以不同的配置运行。为此,我将最后一个放在不同的包和文件中。然后,我有一个全局包,我在其中取消注释我想要合成的配置。我在任何地方都使用这个全局包来声明我的实体 但问题是,事实上,在合成时,配置包中声明的类型和常量是不可见的 我试图在全局包声明上方的全局包文件中声明“use my_package.all”,我还尝试在全局包内部声明 我是说我试过: use work.config1.all; package global_package is ... end g

我有一个用vhdl描述的系统,它将以不同的配置运行。为此,我将最后一个放在不同的包和文件中。然后,我有一个全局包,我在其中取消注释我想要合成的配置。我在任何地方都使用这个全局包来声明我的实体

但问题是,事实上,在合成时,配置包中声明的类型和常量是不可见的

我试图在全局包声明上方的全局包文件中声明“use my_package.all”,我还尝试在全局包内部声明

我是说我试过:

use work.config1.all;
package global_package is
   ...
end global_package;
我试着:

package global_package is
   use work.config1.all;
   ...
end global_package;
这实际上是合成器所接受的

有人有解决办法吗?我真的不想在我所有的文件中注释和取消注释我想要的配置

谢谢大家!

编辑:

例如,如果我有:

文件1:

package config1 is
    constant my_variable : integer := 1;
end config1;
文件2:

package config2 is
    constant my_variable : integer := 2;
end config2;
文件3:

use work.config1.all
-- use work.config2.all

package global is
    constant another_variable : integer := 5;
end global;
文件4:

use work.global.all

entity my_entity is
    port(clk : in std_logic);
end my_entity ;

architecture Behavioral of my_entity is
     signal sig1, sig2 : integer;
begin
     sig1 <= another_variable;  -- I can see and use here the constant "another_variable".
     sig2 <= my_variable; -- Error ! I would like to have access here to the constant "my_variable" that the synthesizer can't see. 
end Behavioral;
使用work.global.all
实体我的实体是
端口(时钟:在标准逻辑中);
结束我的生命实体;
my_实体的架构行为是
信号sig1、sig2:整数;
开始

sig1我不知道有什么简单的方法可以通过使用另一个包使一个包中的内容可见。(这可以在系统verilog中使用
导出
,但这对您没有帮助。)

相反,你可以用其他各种方法来解决你的问题。我不知道你的问题是什么,但这里有一个建议:

package global is
  constant another_variable : integer := 5;
  function set_my_variable (i : integer) return integer;
  constant my_variable : integer := set_my_variable(another_variable);
end global;

package body global is
  function set_my_variable (i : integer) return integer is
  begin
    if i = 5 then
      return 1;
    else
      return 2;
    end if;
  end function;
end package body global;

library IEEE;
use IEEE.std_logic_1164.all;
use work.global.all;

entity my_entity is
    port(clk : in std_logic);
end my_entity ;

architecture Behavioral of my_entity is
     signal sig1, sig2 : integer;
begin
     sig1 <= another_variable;  -- I can see and use here the constant "another_variable".
     sig2 <= my_variable; -- Error ! I would like to have access here to the constant "my_variable" that the synthesizer can't see. 
end Behavioral;
包是全局的
常数另一个_变量:整数:=5;
函数集_my_变量(i:integer)返回整数;
常量my_变量:整数:=设置my_变量(另一个_变量);
结束全球冲突;
包体是全局的
函数集_my_变量(i:integer)返回的整数为
开始
如果i=5,那么
返回1;
其他的
返回2;
如果结束;
末端功能;
端包体全局;
图书馆IEEE;
使用IEEE.std_logic_1164.all;
使用work.global.all;
实体我的实体是
端口(时钟:在标准逻辑中);
结束我的生命实体;
my_实体的架构行为是
信号sig1、sig2:整数;
开始

sig1您是否尝试过上下文子句声明和对它的引用?以下是我的一个参考:

context OsvvmContext is
    library OSVVM ;  
    use OSVVM.AlertLogPkg.all ; 
    use OSVVM.RandomPkg.all ;
    use OSVVM.CoveragePkg.all ;
    use OSVVM.MemoryPkg.all ;
    . . . 
end context OsvvmContext ; 
然后在您的设计中引用它:

library osvvm ;
  context osvvm.OsvvmContext ; 

通过这种方式,您可以编辑上下文子句并更改为整个项目包含的包集。这是VHDL-2008,所以对于合成YMMV,但对于模拟,它是很受支持的。

我不理解你的问题。请你发封邮件好吗?嘿,马修!谢谢你的关注。我编辑了这篇文章,所以你可以看到一个例子。谢谢Matthew,这也是我从一位同事那里得到的答案。VHDL似乎没有提供这样的功能,可以通过另一个包来查看调用的包,不是吗?这正是我想要的!谢谢!