枚举中字符文字的别名的正确语法是什么?

ric*_*ick 2 alias enumeration vhdl enumerated-types ghdl

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

我很疑惑为什么下面的第一个表格被两个编译器(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;
Run Code Online (Sandbox Code Playgroud)

我在其他工具中使用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];
Run Code Online (Sandbox Code Playgroud)

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

use*_*120 5

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

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

ghdl说:

charlitalias.vhdl:5:22: identifier expected here
ghdl: compilation error
Run Code Online (Sandbox Code Playgroud)

虽然不是特别有启发性的错误消息,但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 ] ;
Run Code Online (Sandbox Code Playgroud)

哪里:

name ::=                                                    [§ 6.1]  
      simple_name  
    | operator_symbol  
    | selected_name
    | indexed_name  
    | slice_name  
    | attribute_name  
Run Code Online (Sandbox Code Playgroud)

EBNF for name在-2008标准8.1中更新:

name ::= 
    simple_name
  | operator_symbol 
  | character_literal 
  | selected_name
  | indexed_name
  | slice_name
  | attribute_name 
  | external_name
Run Code Online (Sandbox Code Playgroud)

在2008年,它包含一个字符文字,这是一个词汇元素.

这样做的例子如下:

alias bit_one is '1'[return bit];  
Run Code Online (Sandbox Code Playgroud)

在2008年合法.字符文字可以被视为中的名称alias_declaration.

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

alias bit_one is std.standard.'1'[return bit];
Run Code Online (Sandbox Code Playgroud)

所选名称适用于字符文字的原因可在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为3('U​​','X','0','1', 'Z','W','L','H',' - ').评估表达式需要位置值.

回到ghdl/-1993:

所以选定的名称有效.字符文字本身不适合任何地方在-1993扩展name,但是在-2008.

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

如果他们已经通过了一个标志来确保-1993合规性,则Modelsim和ActiveHDL似乎将枚举文字声明视为函数名称,因为他们接受了别名声明.

在-2008之前,您无法将字符文字视为名称.您始终可以将命名的枚举文字视为名称.您可以想象这种差异是为什么在2008年character_literal被添加的原因name.现在所有枚举文字都是"命名的".

所以我们回答这个问题:

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

隐式别名声明是在非对象别名的部分中找到的语法和语义上正确的表示.它们恰好兼容-1993和-2008标准.您在ghdl中失败并传入Modelsim的示例不是.

要保持修订版的可移植性,请使用选定的名称.您可能会收集新VHDL版本的采用滞后.

这是一个关键的质量问题,首先由Aldec驾驶ActiveHDL的Jerry Kaczynski和Modelsim解决.我所知道的两个开源实现正在积极开发,也正朝着-2008合规的方向发展.