Types 为什么这个任务模棱两可?

Types 为什么这个任务模棱两可?,types,vhdl,aggregate,assign,compound-assignment,Types,Vhdl,Aggregate,Assign,Compound Assignment,请注意,这个问题不是关于如何更改下面的代码以使其工作;相反,我希望了解编译器为何会发现此赋值不明确: entity assignment_to_aggregates is end; architecture example of assignment_to_aggregates is type vowel_type is (a, e, i, o, u); type consonant_type is (b, c, d, f, g); type vowel_consona

请注意,这个问题不是关于如何更改下面的代码以使其工作;相反,我希望了解编译器为何会发现此赋值不明确:

entity assignment_to_aggregates is
end;

architecture example of assignment_to_aggregates is
    type vowel_type is (a, e, i, o, u);
    type consonant_type is (b, c, d, f, g);
    type vowel_consonant_pair is record
        vowel: vowel_type;
        consonant: consonant_type;
    end record;

    signal my_vowel: vowel_type;
    signal my_consonant: consonant_type;
begin
    (my_vowel, my_consonant) <= (a, b); -- Doesn't work: "Ambiguous types in signal assignment statement."
end;
当然,如果我显式地声明一个新类型(示例代码中的元音辅音对)并使用类型限定,它可以正常工作:

(my_vowel, my_consonant) <= vowel_consonant_pair'(a, b); -- Works fine

(我的元音,我的辅音)引自我对上一个问题的回答:

IEEE标准1076-1993,8.4信号分配声明(见-2008,10.5/10.5.2.1):

如果信号赋值语句的目标为 聚合,则聚合的类型必须可以从 上下文,不包括聚合本身,但包括事实 聚合的类型必须是复合类型

再加一点:

-1993,0.2本文件的结构和术语(见-2008,1.3/1.3.1:

此外,“必须”一词用于表示强制重量。 与更常见的“应”相比,这个词更受欢迎,因为“必须”表示 对本标准的不同读者有不同的含义

这是一个语义限制,“必须”具有强制权重,必须满足的条件将在VHDL中生成错误。聚合类型没有限定条件是未知的。请注意,在2008年版本的标准中,“必须”已被“应”取代

此处讨论的类型为目标类型(左侧)。我们受IEEE Std 1076-2008“并发信号分配”一节第一句中“并发信号分配”语句“顺序信号分配”一节的要求约束:

11.6并发信号分配语句

并发信号分配语句表示等效的 为信号赋值的过程语句

(也见于1993年第9.5节)

类型通常作为名称的属性携带,但聚合不是命名对象。可以从右侧获取类型,但它也是聚合:

(my_vowel, my_consonant) <= (a, b);
操作数的类型必须与类型标记的基类型相同。 限定表达式的值是操作数的值 限定表达式的求值对操作数求值并进行检查 其值属于由类型标记表示的子类型

注意--每当枚举文字或聚合的类型不为 根据上下文可知,可以使用限定表达式来声明 显式地创建类型

在任何VHDL标准版本中都没有“上下文”的术语表定义。 一个有效的定义可能包括这样一个概念,即某事物的声明是可见的,而对于没有限定条件的聚合类型则不是这样

我写了对上一个问题的回复,并专门介绍了记录类型声明,以解决在限定表达式中使用类型标记修饰聚合的能力不足。请注意,没有子类型(信号和)声明为元音辅音对记录。需要类型声明,而不是实际记录

另外请注意,我提交了一个关于ghdl-0.31的bug,该bug已修复源代码树,但自-,以后就没有实际版本了。如果不限定表达式,更新版本的ghdl不会崩溃

关于stackoverflow的问题通常会对改进开源VHDL工具做出巨大贡献

我将这些标准放在手边,通常能够引用章节。这可能需要大量的工作,通过全面阅读该标准,你几乎无法了解VHDL,尽管没有一个排列索引,你必须被灌输术语来理解你所读内容的意义

与您当前问题的答案一样,标准中的参考可能会导致标准的另一部分

Jim Lewis在最近的回答中引用的comp.lang.vhdl是一个很好的参考,但有时缺乏权威性的强调,很少引用-1993标准

请参阅常见问题解答

您的困惑似乎源于Modelsim错误消息,提示解决歧义所需的“可能”类型。请注意4.2.18中的第一句:

VHDL是一种强类型语言。因此,编译器不会 执行任何隐式类型转换或尝试“猜测”类型 一种表达方式

骨料是一种表达式(见7.3.2/9.3.3骨料-1993/-2008)

vcom ERROR消息提供的大多数可能的类型声明对于由两个不同类型元素组成的聚合来说都不准确-a是元音字母类型值的枚举名,b是辅音字母类型值的枚举名

vcom错误提供的类型似乎是本地声明(元音辅音对)或上下文子句(标准逻辑向量、实向量、整数向量、位向量、布尔向量、字符串,在ieee.std逻辑1164或标准中统称)可见的所有复合类型


其中只有一个是有效的(元音辅音对)。请注意,VHDL分析器没有猜测,而是要求根据语义规则(信号分配语句8.4/10.5.2.1,“…骨料的类型必须可以从上下文中确定,不包括骨料本身,但包括骨料类型必须是复合类型这一事实”)。给出可能候选、可用复合类型列表的规则,同时不允许猜测(“不包括骨料本身”).

重复的?我没有注意到你故意把这个问题转移到这个问题上。我想我记得以前看到过几乎完全相同的事情…@fru1tbat,我用一个
(my_vowel, my_consonant) <= (a, b);
nvc -a assignment_to_aggregate.vhdl  
** Error: no composite type in context
      File assignment_to_aggregate.vhdl, Line 11  
        (my_vowel, my_consonant) <= (a,b);  
                                    ^^^^^
 qualified_expression ::=
        type_mark ' ( expression )
      | type_mark ' aggregate