web-dev-qa-db-ja.com

VHDLライブラリstd_logic_unsignedおよびnumeric_stdを使用する場合

ISEでVHDL-200Xを使用しています。常にstd_logic_vectorstd_logicintegerbooleanおよびrealのようなデータ型を使用しています。常にstd_logic_vectorintegerに変換して使用します。そして逆に。私のチームメイトは、library IEEEのこれら3つの部分を使用するように私に依頼します。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

しかし、誰かがIEEE.STD_LOGIC_UNSIGNED.ALLの代わりにIEEE.NUMERIC_STD.ALLを使用しないと言いました。numeric_stdに必要なものがすべてあり、STD_LOGIC_UNSIGNEDは標準ライブラリではないためです。 ここ

私はそれについて混乱しました、そして誰でも助けることができますか?

5
Liang He

std_logic_arithまたはstd_logic_**signedは絶対に使用しないでください。符号付きまたは符号なしの値が必要な場合は、常にnumeric_stdを使用してください。前者のパッケージはIEEEであると主張していますが、そうではありません。これらは、SynopsysまたはMentorGraphicsのベンダー固有の拡張機能です。

インポートされたパッケージに基づいて、std_logic_vectorで両方の定義された算術演算。これは例えばつまり、同じアーキテクチャで符号付きと符号なしの値を使用することはできません。

integersですべての計算を行うと、いくつかの欠点があります。

  • 初期化されていない値はありません
  • 'X'伝播なし
  • 32ビットに制限
    (64ビットカウンターの書き方は?)
15
Paebbels

私の純粋主義者側は@Pabblesに同意します。 OTOH、私の実用的な側面は反対します。私の実用的な側面が勝つため、次のことをお勧めします(numeric_std_unsignedがサポートされるまで):

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

RTLの設計では、数学と見なすすべての操作に符号付きと符号なしのタイプを使用することをお勧めします。これは私の純粋な側面です。

RTLでは、std_logic_vectorで計算を行うことはお勧めしません。代わりに、std_logic_unsignedはセーフティネットのためだけにあります。すべての関係演算子が暗黙的に定義されていることを考慮してください(=、/ =、<、<=、>、>-)。設計では、値に対して多くの比較を行います。

if A = "00001" then 
. . . 
if B = X"1A" then 

Aが5ビットでない場合はどうなりますか? Bが8ビットでない場合はどうなりますか?暗黙的に定義された比較を使用する場合、それはFALSEです。 std_logic_unsignedからの比較を使用する場合、サイズが異なっていても問題ありません。 std_logic_unsignedを使用していない場合は、テストベンチでこの問題を見つける必要があります。

「=」はRTLで使用しても問題ないため、誰かがアドレスデコーダーを実行して次のように書き込んだ場合はどうなりますか。

Sel <= '1' when Addr > X"3FFF" else '0' ; 

Aが16ビットの場合、問題なく動作するはずです。 Aが16ビットでない場合はどうなりますか?次に、辞書式(辞書順)の比較を行います。 IE:「100」>「01111」はTRUEです。

Std_logic_unsignedを使用すると、これらは符号なしの数学ルールによって処理されます。ほとんどの場合、どちらが正しいですか。 std_logic_unsignedがないと、これらはFALSEになります。 std_logic_unsignedを使用しておらず、テストベンチに注意している場合は、これを見つける必要があります。

私の懸念は、std_logic_unsignedを使用しない場合、シミュレートする回路が合成する回路とは異なる可能性があることです(合成ツールはstd_logic_unsignedと整合性のある実装を作成する傾向があるため)。シミュレーションでこれを見逃すと、レビューで見つけるのが非常に難しくなります。したがって、通常の関係演算子を使用する場合は、セーフティネットとしてstd_logic_unsignedをお勧めします。

VHDL-2008ではnumeric_std_unsignedパッケージが導入されており、すべての合成ツールで機能する場合は、このパッケージに切り替える予定です。

私の本当に厳密な側面は、std_logic_vectorに対してもそれらをオーバーロードする追加のパッケージを作成することによって、順序付け操作(<、<=、>、> =)の問題に対処する必要があると言っています。したがって、それらを使用すると、あいまいさのためにエラーが発生します。 。これと同じ方法で「=」を保護することはできないことに注意してください。

VHDL-2008は、一致する関係演算 "?="、 "?/ ="、 "?>"、...を追加します。これらが合成ツールで使用できる場合は、これらに切り替えることをお勧めします。一致する等式演算(?=、?/ =)では、オペランドが同じ長さである必要があります。つまり、長さが等しくない場合はコンパイルエラーになります。一致する順序付け演算(?>、?> = 、? <、?<=)は、numeric_stdやnumeric_std_unsignedなどの数学パッケージでのみ定義されます。したがって、適切な数学パッケージを使用しない限り、これらを使用することはできません。

3
Jim Lewis