2

出于教育目的,我试图为作为字符文字的枚举值声明一个别名。在下面的示例中,我尝试为bit_one枚举类型中的值“1”创建别名bit(在 std.standard 中声明)。

我很困惑为什么下面的第一种形式被两个编译器(GHDL 0.29.1 和 Quartus II 13.01)拒绝,而第二种形式被相同的两个编译器接受,加上 ModelSim 和 ActiveHDL。因此问题是:在下面注释掉的行中声明这个别名是非法的吗?

entity character_literal_alias is
end;

architecture rtl of character_literal_alias is
    --alias bit_one is '1'[return bit];             -- Doesn't work in GHDL or Quartus
    alias bit_one is std.standard.'1'[return bit];  -- Works with ModelSim, ActiveHDL, GHDL, and Quartus

    alias append is append_mode[return file_open_kind];  -- Works with the whole bunch
begin
end;

我在其他工具中使用 GHDL 和 VHDL-2008 中的 VHDL-2002 开关。

如果我稍微推测一下,在 VHDL-2008 LRM 中,所有示例都以以下形式编写:

-- implicit aliases ...
-- alias '0' is STD.STANDARD.'0' [return STD.STANDARD.BIT];
-- alias '1' is STD.STANDARD.'1' [return STD.STANDARD.BIT];

但这些是隐式声明,即使示例使用选定的名称,也不意味着每个别名都应该以这种方式声明,IMO。那么也许一些供应商误解了标准?

4

1 回答 1

5

这实际上与哪个 VHDL 工具符合哪个标准版本有关

两套 VHDL分析仪中的一套不符合标准,但哪个标准修订版?

ghdl 说:

charlitalias.vhdl:5:22: identifier expected here
ghdl: compilation error

虽然不是特别有启发性的错误消息,但 ghdl 默认情况下基本上符合 IEEE Std 1076-1993。ghdl 默认--std=93c为 -1993 符合与以后标准更改相关的宽松规则。在-2008修订版之前没有影响这个问题的标准变化,所以--std=02应该没有影响。

除非另有说明,否则以下摘录均来自 -1993 标准。另请注意,标准正文中的 EBNF 是规范性指定语法,而文本提供语义规范。

4.3.3 别名声明

别名声明为现有的命名实体声明了一个备用名称。

alias_declaration ::=  
     alias alias_designator [ : subtype_indication ] is name [ signature ] ;

在哪里:

name ::=                                                    [§ 6.1]  
      simple_name  
    | operator_symbol  
    | selected_name
    | indexed_name  
    | slice_name  
    | attribute_name  

EBNFname在 -2008 标准 8.1 中更新:

name ::= 
    simple_name
  | operator_symbol 
  | character_literal 
  | selected_name
  | indexed_name
  | slice_name
  | attribute_name 
  | external_name

在 -2008 中,它包含一个字符文字,它是一个词法元素。

这使得示例:

alias bit_one is '1'[return bit];  

-2008 年合法。字符文字可以被视为alias_declaration.

通用的示例指定了一个带有后缀的选定名称(扩展名称),该后缀是字符文字:

alias bit_one is std.standard.'1'[return bit];

选定名称适用于字符文字的原因可在 6.3 选定名称第 9 段中找到:

如果前缀表示包并且后缀是命名实体的简单名称、字符文字或运算符符号,则扩展名称表示在包中声明的命名实体,该命名实体的声明立即出现在该包中。

此外,该后缀被视为函数的名称:

3.1.1 枚举类型,第 4 段:

枚举类型定义列出的标识符和字符文字在枚举类型定义中必须是不同的。每个枚举字面量都是对应枚举字面量的声明;为了确定枚举文字的参数和结果类型配置文件,此声明等效于声明无参数函数,其指示符与枚举文字相同,其结果类型与枚举类型相同。

-2008 标准 5.2.2.1 中有一些说明:

...,这个声明相当于一个无参数函数的声明,其指示符与枚举字面量相同,其结果类型与枚举类型相同;尽管如此,声明是文字的声明,而不是函数的声明。

之所以感兴趣,是因为函数是命名的,运算符是函数,并且双引号中的运算符符号允许作为函数名称。然而,没有任何东西允许字符文字作为函数名称。

别名根据它们是否引用对象(信号、常量、变量、文件、命名对象)或其他命名实体来分类。

非对象别名(-1993 4.3.3.2、-2008 6.6.3)需要字符文字的签名。签名提供了一个类似函数的返回类型,为字符文字启用重载解析,这本身就是模棱两可的。了解类型对于消除枚举字面量的位置值的歧义是必要的。以 BIT 类型和 std_ulogic 类型为例。两者都有 '1' 枚举文字,但位置值(自然)对于 BIT ('0', '1') 是 1,对于 std_ulogic ('U', 'X', '0', '1', 'Z'、'W'、'L'、'H'、'-')。评估表达式需要位置值。

回到 ghdl/-1993:

所以一个选定的名字起作用了。字符文字本身不适用于 -1993 的扩展name,但适用于 -2008。

如果 Modelsim 和 ActiveHDL 严格符合 -1993 标准,那么它们就会出错。回想起来很明显,它们符合 -2008 标准,这解释了公认语法的差异。

如果他们被传递了一个标志以确保 -1993 合规性 Modelsim 和 ActiveHDL 如果他们接受了别名声明,它们似乎会将枚举文字声明视为函数名。

在 -2008 之前,您不能将字符文字视为名称。您始终可以将命名枚举文字视为名称。您可以想象这种差异是在 -2008character_literal年添加的原因。name现在所有枚举文字都被“命名”了。

所以我们遇到了这个问题:

但这些是隐式声明,即使示例使用选定的名称,也不意味着每个别名都应该以这种方式声明,IMO。那么也许一些供应商误解了标准?

隐式别名声明是在非对象别名部分中找到的语法和语义正确的表示。它们恰好都符合 -1993 和 -2008 标准。您在 ghdl 中失败并通过 Modelsim 的示例不是。

要保持跨版本的可移植性,请使用选定的名称。您可能会发现采用新的 VHDL 修订版明显滞后。

这是一个关键的质量问题,由 Aldec 的第一任Jerry Kaczynski解决,他驾驶 ActiveHDL,然后是 Modelsim。据我所知,正在积极开发的两个开源实现也在朝着 -2008 合规的方向发展。

于 2014-10-03T03:56:08.573 回答