:`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) >= -1
はFALSE
に評価され、私が使用したときに、これは実行時に報告されていませんfor
ループ。どうしてこれなの?私は、実行時に-1
値を取得するためfor
ループを使用せずにto_unsigned(0, 4) >= -1
を書く場合は、ModelSimのコンパイラは「値-1(タイプstd.STANDARD.NATURALのは)2147483647までの範囲0の外にあることを報告することを
注意"。
IEEE STD 1076から2008 9.3.4関数呼び出し、(一部)パラ5:*関数呼び出しの評価はの評価を含みますファンクションの仮パラメータに関連付けられた実際のパラメータを持たないデフォルト式の呼び出しおよび評価で指定された実際のパラメータ式。どちらの場合も、結果の値は関連する仮パラメータのサブタイプに属します。 ... * Shallは、Modelsimがパフォーマンス目的のためにオプションであるにもかかわらず、必須要件(1.3.1パラ4)を示します。 – user1155120
@BrianDrummond:私の 'numeric_std'パッケージに'> = 'は追加されていません。モジュールやパッケージに自分自身の同様の関数を作成すると、負の値が直ちに報告されます。だから、@ user1155120が示唆するように、ModelSimが 'numeric_std'のためだけに行ったパフォーマンス最適化のように見えます。ModelSimのサポート事例を開始することはほとんど不可能なので、これをメンターに手渡そうとはしません。少なくとも私は必要な注意を持っていません。 – EquipDev