2

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 によると、密接に関連するタイプには次の 2 つのケースがあります。

— 抽象数値型 — 抽象数値型は、他の抽象数値型と密接に関連しています。— 配列型 - 型が同じ次元を持ち、要素型が密接に関連している場合にのみ、2 つの配列型が密接に関連しています。

実数と整数が密接に関連していることは理解しています。それらの間の型変換(別名型キャスト)は正常に機能します。では、なぜ上記の配列型では機能しないのでしょうか?

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).

徹底的にするために、一度に 1 つの要素で同じ操作を実行しようとしました。

int_vect(1) := integer( real_vect(1) );
int_vect(2) := integer( real_vect(2) );
int_vect(3) := integer( real_vect(3) );

そして、それは完璧に機能します。何か案は?

4

1 に答える 1

2

これらのタイプは密接に関連しているべきではありませんか?

デフォルトで厳密に-1993に準拠しているghdlには対応していません。

これは、IEEE Std 1076-1993、7.3.5 Type conversions からのものです。

型変換は、密接に関連する型間の明示的な変換を提供します。
...

b. 配列型 -- 2 つの配列型が密接に関連しているのは、次の場合のみです。

-- 型の次元は同じです。

-- 各インデックス位置について、インデックス タイプは同じか、密接に関連しています。と

-- 要素の型は同じです。
...

他のタイプは密接に関連していません。

問題は、要素の型が同じではないということです。

-2008 では、9.3.6 型変換:

— 抽象数値型 — 抽象数値型は、他の抽象数値型と密接に関連しています。

— 配列型 — 型が同じ次元を持ち、要素型が密接に関連している場合にのみ、2 つの配列型が密接に関連しています。

これは、抽象数値型 (整数、実数) が密接に関連していること、および要素型が密接に関連している場合、配列型が密接に関連していることを示しています。

したがって、指定した Modelsim バージョンが変更に準拠していないか、何かが -2008 フラグの呼び出しを停止したようです。

私の Mac には、ghdl 用にロードされた -2008 バージョンのライブラリがありません。--std=08 フラグを使用しても、そうなるとは思えません。

Sourceforge の ghdl-updates から最新の ghdl ソース コードをチェックアウトしました。密接に関連する要素を持つ密接に関連する配列型を実装する変更は組み込まれていません。sem_names.adb の 1024 ~ 1047 行を参照してください。

このように標準の改訂のために実装されていないものを見つけた場合、それは通常、失敗したり合格したりするテスト ケースがなく、標準のバージョン間の変更を確認する方法がないためです。

差分 PDF と、さまざまな条項と副次条項の間の要件を関連付ける方法、および標準のステートメントがテスト可能かどうか、可能であればどのコードでテスト可能かを判断する方法が必要です。著作権が実装の邪魔になっていると言っても過言ではありません。

-2008 規格のサッド ファクター (ページ数) も、準拠の問題が発生する可能性に影響します

何か案は?

 int_vect := integer_vector'(integer(real_vect(1)),integer(real_vect(2)), integer(real_vect(3)));
于 2014-09-18T08:23:25.577 に答える