我正在尝试分析以下与VHDL-2008兼容的文件。
entity closely_related is
end;
architecture example of closely_related is
type integer_vector is array (natural range <>) of integer;
type real_vector is array (natural range <>) of real;
begin
process
variable int_vect: integer_vector(1 to 3);
variable real_vect: real_vector(1 to 3);
begin
real_vect := ( 1.0, 2.0, 3.0 );
int_vect := integer_vector( real_vect );
wait;
end process;
end;
这应该是关于密切相关类型的实验。根据LRM,有两种密切相关的类型:
- 抽象数字类型 - 任何抽象数字类型与任何其他抽象数字密切相关 类型。 - 数组类型 - 当且仅当类型具有相同类型时,两种数组类型密切相关 维度与元素类型密切相关
我知道实际和整数密切相关;它们之间的类型转换(又名类型转换)工作正常。那为什么它不适用于上面的数组类型?
GHDL给出以下错误:
conversion not allowed between not closely related types
而Modelsim Altera 10.1e(带-2008开关)并不是更好:
Illegal type conversion from std.STANDARD.REAL_VECTOR to std.STANDARD.INTEGER_VECTOR
(array element type difference).
为了彻底,我试图一次做一个元素的相同操作:
int_vect(1) := integer( real_vect(1) );
int_vect(2) := integer( real_vect(2) );
int_vect(3) := integer( real_vect(3) );
它完美无缺。有什么想法吗?
答案 0 :(得分:2)
这些类型不应该密切相关吗?
不适用于默认情况下严格遵守-1993的ghdl。
这来自IEEE Std 1076-1993,7.3.5类型转换:
类型转换提供了密切相关类型之间的显式转换 ......
湾数组类型 - 当且仅当
时,两种数组类型密切相关- 类型具有相同的维度;
- 对于每个索引位置,索引类型相同或密切相关;和
- 元素类型相同 ......
没有其他类型密切相关。
所以问题是元素类型不一样。
在-2008,9.3.6类型转换:
- 抽象数字类型 - 任何抽象数字类型与任何其他抽象数字类型密切相关。
- 数组类型 - 当且仅当类型具有相同的维度且元素类型密切相关时,两种数组类型密切相关
这告诉我们任何抽象数字类型(整数,真实)都是密切相关的,当它们的元素类型密切相关时,这些数组类型现在密切相关。
所以它看起来像你指定的Modelsim版本不符合更改或者停止调用你的-2008标志。
我的Mac上没有为ghdl加载的-2008版本的库。我不打赌它会用--std = 08标志。
我在Sourceforge上检查了ghdl-updates中的最新ghdl源代码,但是没有合并使用密切相关的元素实现密切相关的数组类型的更改。请参见sem_names.adb行1024 - 1047。
当我们发现由于标准中的修订而未能实现的内容时,这通常是因为没有测试用例失败或通过时应该通过,并且因为没有办法看到标准版本之间的变化。
您需要一个diff PDF和一种关联各个子句和子条款之间的要求的方法,以及确定标准中的语句是否可测试,如果是,则通过什么代码确定。可以肯定地说,版权正在妨碍实施。
-2008标准的 thud因子 (页数)也会影响合规性陷阱的可能性。
有什么想法吗?
int_vect := integer_vector'(integer(real_vect(1)),integer(real_vect(2)), integer(real_vect(3)));