难道这些类型不应该密切相关吗?

时间:2014-09-18 07:41:28

标签: arrays casting type-conversion vhdl ghdl

我正在尝试分析以下与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) );

它完美无缺。有什么想法吗?

1 个答案:

答案 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)));