【发布时间】:2019-10-16 18:05:36
【问题描述】:
我想要一个包含依赖泛型的类型的包,以便我可以在项目中使用它们。但是我在端口声明中使用这些依赖类型时遇到了问题:
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;
use work.all;
entity dependent_entity_with_dependent_port is
generic (generic_value : natural);
package instantiated_types is new dependent_types
generic map (generic_value => generic_value);
use instantiated_types.all;
port (dependent_port : out dependent_type);
end dependent_entity_with_dependent_port;
似乎实体声明部分(包实例化、使用子句)必须在端口声明之后。这可以防止使用在依赖于实体泛型的泛型包中定义的类型。
有什么办法可以做到吗?
【问题讨论】:
-
您依赖的是子类型而不是类型。 IEEE Std 1076-2008 6.5.5 接口包声明“接口包声明声明了一个接口包显示为设计实体的通用、组件、块、包或子程序。 "但是,这里不需要。
dependent_port的子类型可以从generic_value构造 -library ieee; use ieee.std_logic_1164.all; entity with_dependent_port is generic ( generic_value: positive); port ( dependent_port: out std_ulogic_vector(generic_value - 1 downto 0)); end entity; -
您还可以注意到,实例化包的声明不同于任何其他实例化。尽管有名称,但这种包实例化中的类型声明在端口关联的两侧不会是相同的类型。抽象出类型的正确方法是使用泛型类型,它映射到子类型(并且可以具有兼容的约束以及某些类型)。一般来说,泛型类型不受支持,泛型包在综合中也不受广泛支持。
-
泛型类型 - 唯一的接口类型声明 (6.5.3) 提供类型的基本和预定义操作。 “块语句(包括表示组件实例或绑定设计实体的隐含块语句)、通用映射包或通用映射子程序的接口类型声明的名称表示指定为相应实际的子类型通用关联列表。”不幸的是,综合工具没有广泛支持(如果有的话)接口类型声明。