Generics VHDL在端口规范中使用依赖的泛型类型

Generics VHDL在端口规范中使用依赖的泛型类型,generics,vhdl,Generics,Vhdl,我希望有一个包含依赖于泛型的类型的包,以便我可以在项目中使用它们。但是,在端口声明中使用这些依赖类型时遇到问题: ieee库; 使用ieee.std_logic_1164.all; 使用ieee.numeric_std.all; 依赖于包的_类型是 通用(通用值:自然); 依赖于子类型的类型是标准逻辑向量(通用值-1到0); 端包装; 使用work.all; 实体依赖\u具有\u依赖\u端口的实体\u为 通用(通用值:自然); 包实例化的\u类型是新的依赖\u类型 通用映射(通用_值=>通用_值

我希望有一个包含依赖于泛型的类型的包,以便我可以在项目中使用它们。但是,在端口声明中使用这些依赖类型时遇到问题:

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
依赖于包的_类型是
通用(通用值:自然);
依赖于子类型的类型是标准逻辑向量(通用值-1到0);
端包装;
使用work.all;
实体依赖\u具有\u依赖\u端口的实体\u为
通用(通用值:自然);
包实例化的\u类型是新的依赖\u类型
通用映射(通用_值=>通用_值);
使用实例化的_type.all;
端口(依赖\u端口:输出依赖\u类型);
使用依赖端口结束依赖实体;
实体声明部分(包实例化、use子句)似乎必须在端口声明之后。这将防止使用依赖于实体泛型的泛型包中定义的类型


有什么方法可以实现这一点吗?

我认为不可能实现您想要的操作-将包generic设置为普通generic,然后将其用作端口。但是,您可以在如下包中使用延迟常量:

此代码只编译一次,并且是稳定的:

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

package dependent_types is
    generic (generic_value : natural);
    subtype dependent_type is std_ulogic_vector (generic_value - 1 downto 0);
end package;

package constants is
  constant generic_value : natural;
end package;
每次常量更改时,都需要重新编译此代码:

package body constants is
  constant generic_value : natural := 16;
end package body ;

use work.all;
use work.constants.all;
package instantiated_types is new dependent_types
    generic map (generic_value => generic_value);

use work.instantiated_types.all;
entity dependent_entity_with_dependent_port is
    port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;

architecture A of dependent_entity_with_dependent_port is
begin
end;

您依赖的是子类型而不是类型。IEEE Std 1076-2008 6.5.5接口包声明“接口包声明声明作为设计实体、组件、块、包或子程序的泛型出现的接口包。”但此处不需要这样做。
依赖\u端口的子类型
可以从
通用\u值
-
库构建;使用ieee.std_logic_1164.all;具有依赖于\u端口的实体是通用的(通用\u值:正);端口(相关端口:输出标准逻辑向量(通用值-1到0));终端实体您还可以注意到实例化包的声明与任何其他实例化都是唯一的。这种包实例化中的类型声明在端口关联的两侧不会是相同的类型,尽管名称不同。抽象掉类型的正确方法是使用泛型类型,它映射到子类型(并且可以有兼容的约束和某些类型)。一般来说,泛型类型不受支持,泛型包在综合中也不受广泛支持。泛型类型-唯一接口类型声明(6.5.3)提供了类型的基本和预定义操作。块语句(包括表示组件实例或绑定设计实体的隐含块语句)、泛型映射包或泛型映射子程序的接口类型声明的名称表示在泛型关联列表中指定为相应实际值的子类型不幸的是,合成工具并不广泛支持接口类型声明(如果有的话)。VHDL 2008允许包作为泛型。因此,您应该能够从通用包中提取任何内容。(不过不要认为有太多的工具支持。ActiveHDL 11.1最终发布时会有它。)包实例化是一个主要单元(13.1),在
使用实例化的类型之前显示一行新行
(这不应该是
工作的。实例化的\u类型。所有的
依赖的\u类型
包实例化的\u类型中可见的是新的依赖的\u类型
?Riviera Pro似乎获得了13.2设计库的诗意许可“除上下文声明和包标准外,每个设计单元都假定包含以下隐式上下文项作为其上下文子句的一部分:library STD,WORK;use STD.STANDARD.all;”添加隐式use子句
use WORK.all;
.Portability问题。@user1155120已修复。@user1155120我注意到“许可证”的问题“在ActiveHDL中也是如此,但在11.1中似乎有所收紧(目前处于预发布阶段)