2017-01-16 2 views
2

`to_unsigned(0、4)> = -1`は実行時に` FALSE`に評価されるのはなぜですか?以下のテストコードの使用

library ieee; 
use ieee.numeric_std.all; 
architecture sim of tb is 
begin 
    process is 
    begin 
    for c in -1 to 1 loop 
     assert to_unsigned(0, 4) >= c report "Fails: 0 >= " & integer'image(c) severity NOTE; 
    end loop; 
    wait; 
    end process; 
end architecture; 

はModelSimの10.5aを使用して、この出力を示しています。

Loading work.tb(sim) 
** Note: Fails: 0 >= -1 
    Time: 0 ns Iteration: 0 Instance: /tb 
** Note: Fails: 0 >= 1 
    Time: 0 ns Iteration: 0 Instance: /tb 

ので、効果的にto_unsigned(0, 4) >= -1FALSEに評価され、私が使用したときに、これは実行時に報告されていませんforループ。どうしてこれなの?私は、実行時に-1値を取得するためforループを使用せずにto_unsigned(0, 4) >= -1を書く場合は、ModelSimのコンパイラは「値-1(タイプstd.STANDARD.NATURALのは)2147483647までの範囲0の外にあることを報告することを

注意"。

答えて

2

TL/DR:Modelsimの技術サポートを受けるところは、この質問をして、質問に回答してください。

迅速リライトと(一般にはかなり厳密で正確な)GHDLシミュレータとクロスチェック:

library ieee; 
use ieee.numeric_std.all; 

entity tb is 
end tb; 

architecture sim of tb is 
begin 
    process is 
    begin 
    for c in -1 to 1 loop 
     assert to_unsigned(0, 4) 
     >= 
     c 
     report "Fails: 0 >= " & integer'image(c) severity NOTE; 
    end loop; 
    wait; 
    end process; 
end architecture; 

ghdl -r tb
./tb:error: bound check failure at tb.vhd:14
./tb:error: simulation failed

正確内にないcの評価で結合チェックエラーを示します署名されていないまたは自然のための法的範囲。

ghdlかModelsimのどちらかが不適切な>=演算子を選んだのでしょうか?

numeric_stdのソースには、最初の引数がunsignedの2つの>=演算子定義のみが表示されます。 (このファイルは、VHDL-2008規格のように、「著作権2008」である。)署名された量(符号付きまたは整数)を可能にする

-- Id: C.19 
    function ">=" (L, R : UNRESOLVED_UNSIGNED) return BOOLEAN; 
    -- Result subtype: BOOLEAN 
    -- Result: Computes "L >= R" where L and R are UNRESOLVED_UNSIGNED vectors possibly 
    --   of different lengths. 

    -- Id: C.23 
    function ">=" (L : UNRESOLVED_UNSIGNED; R : NATURAL) return BOOLEAN; 
    -- Result subtype: BOOLEAN 
    -- Result: Computes "L >= R" where L is an UNRESOLVED_UNSIGNED vector and 
    --   R is a nonnegative INTEGER. 

いずれもの第2引数として。

numeric_stdのソースをインストールして、別のリビジョンかどうかを確認し、>=演算子でUnsignedとIntegerのデータ型が混在しているかどうかを確認することができます。私はそれが存在することを疑う:それはちょうどこの種の誤解に危険な傾向があるだろう。

このような演算子がない場合、ここではModelsimが許可されています。より厳しいコンプライアンスを有効にするコンパイルオプションはありますか?

そして、あなたはこれが必要以上に知識をひけらかすと思われる場合、この考慮してください。

c := -1; 
if to_unsigned(0, 4) >= c then 
    emergency_stop; 
end if; 
+0

IEEE STD 1076から2008 9.3.4関数呼び出し、(一部)パラ5:*関数呼び出しの評価はの評価を含みますファンクションの仮パラメータに関連付けられた実際のパラメータを持たないデフォルト式の呼び出しおよび評価で指定された実際のパラメータ式。どちらの場合も、結果の値は関連する仮パラメータのサブタイプに属します。 ... * Shallは、Modelsimがパフォーマンス目的のためにオプションであるにもかかわらず、必須要件(1.3.1パラ4)を示します。 – user1155120

+0

@BrianDrummond:私の 'numeric_std'パッケージに'> = 'は追加されていません。モジュールやパッケージに自分自身の同様の関数を作成すると、負の値が直ちに報告されます。だから、@ user1155120が示唆するように、ModelSimが 'numeric_std'のためだけに行ったパフォーマンス最適化のように見えます。ModelSimのサポート事例を開始することはほとんど不可能なので、これをメンターに手渡そうとはしません。少なくとも私は必要な注意を持っていません。 – EquipDev

関連する問題