为什么这个Modelsim错误? “信号分配声明中的模糊类型。”

时间:2014-05-06 20:02:05

标签: variable-assignment vhdl aggregate

我正在尝试使用ModelSim Microsemi 10.2c编译以下示例:

architecture example of assignment_to_an_aggregate is
    type vowel_type is (a, e, i, o, u);
    type consonant_type is (b, c, d, f, g);

    signal my_vowel: vowel_type;
    signal my_consonant: consonant_type;
begin

    (my_vowel, my_consonant) <= (a, b);

end;

它会出现以下错误:

** Error: assignment_to_aggregates.vhdl(40): (vcom-1349) Ambiguous types in signal assignment statement.

   Possible target types are:
        std.STANDARD.TIME_VECTOR
        std.STANDARD.REAL_VECTOR
        std.STANDARD.INTEGER_VECTOR
        std.STANDARD.BIT_VECTOR
        std.STANDARD.BOOLEAN_VECTOR
        std.STANDARD.STRING

** Error: assignment_to_aggregates.vhdl(57): VHDL Compiler exiting

任何人都可以解释,这不起作用吗?为什么编译器会认为TIME_VECTOR,STRING等是这个赋值目标的合理类型?注意:即使目标聚合只有相同类型的信号,我也会得到相同的错误。

谢谢!

1 个答案:

答案 0 :(得分:4)

虽然我不能评论Modelsim类型消息的特性,但问题是右侧聚合的类型无法从上下文中辨别出来。

尝试:

entity assignment_to_an_aggregate is
end entity;
architecture example of assignment_to_an_aggregate is
    type vowel_type is (a, e, i, o, u);
    type consonant_type is (b, c, d, f, g);

    type vowel_consonant 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) <= vowel_consonant'(a,b);

end;

你会注意到左侧聚合取决于它的类型的右侧表达式。

(类型声明不承担模拟或合成开销负担,也没有声明为记录类型的命名对象。

好的,如果我理解正确,那么出现在作业右侧的所有内容都需要有明确定义的类型?换句话说,每个聚合必须有一个定义的类型? - VHDL Addict 5分钟前

没有。在这种情况下,信号分配的目标是聚合:

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

  

如果信号赋值语句的目标是a的形式   聚合,那么聚合的类型必须是可以确定的   上下文,不包括聚合本身,但包括事实   聚合的类型必须是复合类型。

除了右手边还有什么其他背景?您不能使左侧的聚合成为限定表达式。必须命名信号分配的目标,并且表达式没有名称。

您获得的Modelsim错误消息没有指定它所抱怨的赋值语句的哪一侧,而其他一些工具可能更具启发性:

  
    

assignment_to_aggregate.vhdl:23:19:波形类型未知,使用类型限定符

  

您是否注意到错误消息适用于不需要它们的人?