我正在尝试使用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等是这个赋值目标的合理类型?注意:即使目标聚合只有相同类型的信号,我也会得到相同的错误。
谢谢!
答案 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:波形类型未知,使用类型限定符
您是否注意到错误消息适用于不需要它们的人?