【问题标题】:Shouldn't these types be closely related?这些类型不应该密切相关吗?
【发布时间】:2014-11-12 10:55:56
【问题描述】:

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

而且效果很好。有什么想法吗?

【问题讨论】:

  • VHDL-2008 将 integer_vector 和 real_vector 类型添加到包标准中。您是否在设计中重新定义了这些类型?您是否在打开 VHDL-2008 开关且未定义您自己的类型的情况下尝试过此操作?
  • @JimLewis 回想起来,也许我应该使用不同的名称......现在我已经做到了,并在 Modelsim 中测试了四种组合:带/不带 -2008,带/不带重载名称(即将类型重命名为 my_integer_vector 和 my_real_vector),以及使用 std.standard 中的类型的第五个替代方案(即注释掉类型声明)。在所有五种情况下,我都会遇到相同的错误。
  • 听起来你发现了一个错误。你提交了吗?
  • @JimLewis 我已经在他们的公共论坛上发布了一份报告,因为我不是企业客户。那里的版主说他会把它传递出去。

标签: arrays casting type-conversion vhdl ghdl


【解决方案1】:

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

不适用于默认严格遵守 -1993 的 ghdl。

这是来自 IEEE Std 1076-1993, 7.3.5 类型转换:

类型转换提供了密切相关类型之间的显式转换。
...

b.数组类型——两个数组类型密切相关当且仅当

-- 类型具有相同的维度;

-- 对于每个索引位置,索引类型要么相同,要么密切相关;和

-- 元素类型相同。
...

没有其他类型密切相关。

所以问题是元素类型不一样。

-2008 年,9.3.6 类型转换:

——抽象数字类型——任何抽象数字类型都与任何其他抽象数字类型密切相关。

——数组类型——两个数组类型密切相关当且仅当类型具有相同的维度并且元素类型密切相关

这告诉我们,任何抽象数值类型(整数、实数)都是密切相关的,而当它们的元素类型密切相关时,数组类型现在也密切相关。

所以看起来您指定的 Modelsim 版本不符合更改,或者某些东西停止了调用您的 -2008 标志。

我的 Mac 上没有为 ghdl 加载的 -2008 版本的库。我也不会打赌它会使用 --std=08 标志。

我从 Sourceforge 上的 ghdl-updates 中查看了最新的 ghdl 源代码,尚未合并使用密切相关的元素实现密切相关的数组类型的更改。见 sem_names.adb 第 1024 - 1047 行。

当我们发现由于像这样的标准修订而没有实现的东西时,通常是因为没有测试用例在应该失败或通过时,并且因为没有办法看到标准版本之间的变化。

您需要一个 diff PDF 和一种将各种条款和子条款之间的要求关联起来的方法,以及确定标准中的语句是否可测试,如果可以,则通过什么代码测试。可以肯定地说,版权正在阻碍实施。

thud factor -2008 标准的(页数)也会影响合规问题发生的可能性。 em>

有什么想法吗?

 int_vect := integer_vector'(integer(real_vect(1)),integer(real_vect(2)), integer(real_vect(3)));

【讨论】:

  • 我明白了,所以这是从 VHDL-93 到 -2008 的更改。您提供的文字来自我上面的同一部分。然后 GHDL 摆脱了困境,因为它不应该是兼容的,但 ModelSim 应该支持它。
  • ghdl 默认严格遵守 -1993。您指定的 Modelsim 版本似乎不符合更改。
  • 但是您是否同意从更新的文本 [9.3.6 类型转换] 这两种数组类型在 VHDL-2008 中密切相关?
  • 是的。我同意相同维度的数组类型和密切相关的元素类型在 1076-2008 中密切相关。你可能会发现即使被接受也不会合成。
猜你喜欢
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多