ISEでVHDL-200Xを使用しています。常にstd_logic_vector
、std_logic
、integer
、boolean
およびreal
のようなデータ型を使用しています。常にstd_logic_vector
をinteger
に変換して使用します。そして逆に。私のチームメイトは、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
は標準ライブラリではないためです。 ここ 。
私はそれについて混乱しました、そして誰でも助けることができますか?
std_logic_arith
またはstd_logic_**signed
は絶対に使用しないでください。符号付きまたは符号なしの値が必要な場合は、常にnumeric_std
を使用してください。前者のパッケージはIEEEであると主張していますが、そうではありません。これらは、SynopsysまたはMentorGraphicsのベンダー固有の拡張機能です。
インポートされたパッケージに基づいて、std_logic_vector
で両方の定義された算術演算。これは例えばつまり、同じアーキテクチャで符号付きと符号なしの値を使用することはできません。
integer
sですべての計算を行うと、いくつかの欠点があります。
私の純粋主義者側は@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などの数学パッケージでのみ定義されます。したがって、適切な数学パッケージを使用しない限り、これらを使用することはできません。