2

誰かが VHDL のto_unsignedの仕組みを説明したり、私の理解が正しいことを確認したりできますか? 例えば:

C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31))

ここに私の理解があります:

  • -30 は符号付きの値で、1111111111100010 としてビットで表されます
  • C の値を作成するには、すべてのビットを反転し、それに「1」を追加する必要があります。
  • 0000000000011101+0000000000000001 == 0000000000011111
4

2 に答える 2

4

IEEE パッケージの numeric_std では、次の宣言が行われTO_UNSIGNEDます。

  -- Id: D.3
  function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED;
  -- Result subtype: UNSIGNED(SIZE-1 downto 0)
  -- Result: Converts a non-negative INTEGER to an UNSIGNED vector with
  --         the specified SIZE.

整数型として宣言された引数またはサイズで宣言された関数 to_unsigned は見つかりません。結果は何ですか?

それを最小限、完全、かつ検証可能な例に入れましょう:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity what_to_unsigned is
end entity;

architecture does of what_to_unsigned is
    signal C:   std_logic_vector (31 downto 0);
begin

    C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31));

end architecture;

VHDL アナライザーは次のエラーを返します。

ghdl -a what_to_unsigned.vhdl
what_to_unsigned.vhdl:12:53: 静的定数が境界に違反しています
ghdl: コンパイル エラー

-30 (行 12: 文字 53) に境界違反があることを教えてください。この場合、 universal_integerに変換された数値リテラルnaturalは function の型に変換されませんto_unsigned

別のツールを使用すると、もう少しグラフィカルに表示される場合があります。

nvc -a what_to_unsigned.vhdl  
** Error: value -30 out of bounds 0 to 2147483647 for parameter ARG  
  File what_to_unsigned.vhdl, Line 12  
        C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31));  
                                                        ^^^

そして実際に、ソース コードのどこでエラーが見つかったかがわかります。

to_unsigned が行うと考えていることは、アナライザーが行うと考えていることではないと言っても過言ではありません。

VHDL は厳密に型指定された言語です。IEEE パッケージの numeric_std で宣言されARGた関数の引数の範囲外の値を指定しようとしました。TO_UNSIGNED

タイプ NATURAL はパッケージ standard で宣言され、推論された宣言ライブラリ std によって可視化されます。std.standard.all を使用します。コンテキスト句で。(IEEE Std 1076-2008、13.2 デザイン ライブラリを参照):

コンテキスト宣言とパッケージ STANDARD を除くすべての設計単位は、そのコンテキスト句の一部として次の暗黙のコンテキスト項目を含むと見なされます。

library STD, WORK; use STD.STANDARD.all;

16.3 Package STANDARD に含まれる Natural の宣言:

subtype NATURAL is INTEGER range 0 to INTEGER'HIGH;

NATURAL として宣言された値は、負の数を除く制限された範囲を持つ INTEGER のサブタイプです。

ここでは、VHDL 標準準拠のツールにアクセスし、IEEE Std 1076-2008、IEEE 標準 VHDL 言語リファレンス マニュアルを参照することで、この質問に答えることができることがわかります。

TL:DR; 詳細9.4 静的式、9.4.1 一般では、分析中にローカルで静的
式 を評価する許可が与えられていることに注意してください。

特定の式は静的であると言われます。同様に、特定の離散範囲は静的であると言われ、特定のサブタイプの型マークは静的サブタイプを示すと言われています。

静的表現には 2 つのカテゴリがあります。特定の形式の表現は、それらが出現する設計単位の分析中に評価できます。このような式は、ローカルに static であると言われます。特定の形式の表現は、それらが現れる設計階層が精緻化されるとすぐに評価できます。このような式はグローバルに静的であると言われます。

分析中にローカルで静的な式を評価しない標準準拠のツールがいくつかある場合があります。「できる」は許容的であり、必須ではありません。上記のコード例で示した 2 つの VHDL ツールは、その権限を利用しています。どちらのツールでも、コマンド ライン引数 -a は、提供されたファイルを分析するようにツールに指示します。このファイルは、成功した場合、現在の作業ライブラリに挿入されます (デフォルトでは WORK、13.5 分析の順序、13.2 デザイン ライブラリを参照)。

局所的に静的な式の精緻化で境界チェックを評価するツールは、通常、純粋に解釈的であり、別の分析パスで克服することさえできます。

VHDL 言語は、附属書 D で指定された境界内の正式な証明で使用される設計モデルの正式な仕様に使用できます

エラー メッセージの標準化やツールの実装方法に関する制限はありませんが、VHDL 準拠のツールでは同じ結果が得られることが保証されています。

于 2015-10-21T19:05:55.803 に答える