在任何版本的VHDL(可能是2008年)中,是否可以在声明之前使用类型?
E.g。我在实体的体系结构中有这个数组声明:
type my_array is array (integer range <>) of my_type;
仍然在同一个架构部分,但稍后在文件中我有这个:
type my_type is record
my_field: signed(31 downto 0);
end record;
现在,这在Vivado中出现以下错误:
[Synth 8-1031] my_type未声明
解决方案当然是将记录声明移到数组声明之上。然而,随着类型数量的增加,这变得非常复杂和混乱(因为你基本上必须在拓扑上对你的类型进行排序,并将其依赖性考虑在内)。
每种主要的编程语言都支持这样的东西,所以我想也许它也会存在于VHDL中。我还清楚地记得在VHDL 2008中已经添加了这个,但是找不到任何有关它的资源,而且我使用VHDL 2008的快速测试是否定的。
所以可以在声明之前在VHDL中使用一个类型,因为声明的类型仍然在同一个体系结构,同一个文件中,但下面几行?
答案 0 :(得分:2)
在任何版本的VHDL(可能是2008年)中,是否可以在声明之前使用类型?
没有。
IEEE Std 1076-2008 6.声明
6.1一般
该语言定义了几种由声明显式或隐式声明的命名实体。每个实体的名称由声明定义,可以是标识符,也可以是操作符号或字符文字 ...
对于每种形式的声明,语言规则定义了一个称为声明范围的特定文本区域(见12.2)。 ...
12.2声明范围
除了体系结构体之外,声明的范围从声明的开头延伸到紧邻的声明性区域的末尾;体系结构体的范围从体系结构体的开头到结尾。在任何一种情况下,声明范围的这一部分称为立即范围。
12.3可见性
声明仅在其范围的某一部分内可见;除了PSL验证单元,包装声明或受保护类型声明之外的设计单元的声明,此部分从声明结束开始,在这种情况下,它在保留字发生在标识符之后立即开始。设计单元,包声明或受保护的类型声明。此规则适用于显式和隐式声明。
可见性规则阻止您在声明类型之前引用该类型。
VHDL也不支持除接口类型声明(泛型类型)以外的类型的前向声明,但是对于示例my_array
所示的子类型也是如此。
通用类型Brian表示缺乏综合供应商的支持以及对Peter Ashenden的书 VHDL 2008 Just the New Stuff 中概述的类型操作的限制(参见6.5.3接口类型声明)的有用性是有限的>:
1.1通用类型
VHDL-2008定义了许多规则,涵盖了正式泛型类型及其使用方式。正式通用类型名称可能表示任何约束类型,但文件类型或受保护类型除外。实体只能假定所有这些类型的可用操作都适用,即:赋值;使用新分配;类型资格和类型转换;以及平等和不平等的运作。形式泛型类型不能用作文件元素或属性的类型。此外,如果实际类型不是访问类型且不包含访问类型的子元素,则它只能用作显式声明的常量或信号(包括端口)的类型。对于信号,实际类型的预定义相等运算符用于驱动程序更新和事件检测。
答案 1 :(得分:2)
请注意,对于访问类型,有一种特殊情况,其中可以引用不完整的类型声明,以便允许链接列表的类型,例如:
type value_cell; -- Incomplete declaration
type value_ptr is access value_cell; -- value_cell only for access type
type value_cell is record -- Full declaration
value : bit_vector(0 to 3);
next_cell : value_ptr;
end record value_cell;
但是,这不是在声明之前使用的类型,并且访问类型既不可合成,但它对于测试平台代码是一种有用的技术。