【问题标题】:Use a type before it's declared in VHDL (2008)在 VHDL (2008) 中声明类型之前使用它
【发布时间】:2016-09-21 23:24:50
【问题描述】:

是否有可能在任何版本的 VHDL 中(可能是 2008 年)在声明类型之前使用它?

例如我在实体的架构中有这个数组声明:

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 中使用一个类型,因为该类型仍然在相同的体系结构、相同的文件中声明,但在下面几行?

【问题讨论】:

  • VHDL-2008 中的泛型类型可能会有所帮助。
  • 嗯。虽然泛型可能有助于简化一些复杂的依赖关系,但我认为这并没有使事情变得更容易(因为现在您必须小心单独插入泛型,这可能会导致更长和更难阅读代码以及重复)。

标签: vhdl xilinx vivado


【解决方案1】:

是否有可能在任何版本的 VHDL 中(可能是 2008 年)在声明类型之前使用它?

没有。

IEEE 标准 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 定义了许多规则,涵盖正式的泛型类型及其使用方式。正式的泛型类型名称可以潜在地表示任何受约束的类型,除了文件类型或受保护的类型。实体只能假设适用于所有此类类型的操作,即:赋值;使用新分配;类型限定和类型转换;以及相等和不等式运算。正式的泛型类型不能用作文件元素或属性的类型。此外,如果实际类型不是访问类型并且不包含访问类型的子元素,则它只能用作显式声明的常量或信号(包括端口)的类型。对于信号,实际类型的预定义相等运算符用于驱动程序更新和事件检测。

【讨论】:

  • 这很可悲,但我想人们必须忍受不便的事实。您是否知道任何间接解决方法,例如偶然访问类型?
【解决方案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;

但是,这并没有使用之前声明的类型,访问类型也不是可综合的,但它对于测试台代码是一种有用的技术。

【讨论】:

  • 这看起来完全可以解决我的问题。但正如你所说,这不是可合成的,这真是太可惜了……不幸的是,我需要它来合成代码。
猜你喜欢
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多