Altifigence Academy

18 / 63 · 概念

比較器と境界値の仕様

同じビット列の unsigned・signed 比較を区別し、境界条件を検証します。

大小は最上位の異なる桁で決まります

二つの unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 詳しく見る ベクトルを MSBMSB 最も高い桁の重みを持つビットです。ベクトルの宣言方向でインデックスが変わるため、常に最大番号とは限りません。 詳しく見る から比較し、最初に異なるビットを探します。その桁で 1 の方が大きい値です。ei=ai⊕bi‾e_i=\overline{a_i\oplus b_i} とすると、4 ビットの大小比較は次の式になります。

gt⁡(a,b)=a3b‾3+e3a2b‾2+e3e2a1b‾1+e3e2e1a0b‾0\operatorname{gt}(a,b)=a_3\overline b_3+e_3a_2\overline b_2+e_3e_2a_1\overline b_1+e_3e_2e_1a_0\overline b_0

左辺の gt⁡(a,b)\operatorname{gt}(a,b) は、比較結果のブール値です。上位桁がすべて同じときだけ、下位桁の比較が結果に影響します。等値比較はすべての eie_i の AND です。

signed 比較では先に符号を解釈します

4'b1111 と 4'b0001 は unsigned なら 15 と 1、signed なら -1 と 1 です。符号が異なれば負の方が小さくなります。logic [3:0] と logic signed [3:0] の違いは記憶容量ではなく、演算に使う解釈です。

SystemVerilog
logic [3:0] a, b;
logic unsigned_lt, signed_lt;
assign unsigned_lt = a < b;
assign signed_lt = $signed(a) < $signed(b);

このコードは両オペランドの幅が同じ場合です。幅が異なるなら、単純にキャストする前に、どの幅へ拡張するかを決めます。

同じ二つのビット列でも、符号の取り決めが違えば大小関係が逆転します。上位桁から比較する unsigned の規則を、signed 値にそのまま適用しないでください。

ビット列を比較する前に解釈を決める
  1. 1111 vs 0001: 同じ 4 ビット入力
  2. 符号なし: 15 は 1 より大きい
  3. 符号付き: −1 は 1 より小さい

境界条件を文章で固定します

16 項目を格納するバッファでは、count==16 が full、count<16 が追加格納可能を表します。count が 4 ビットなら 16 を表せず、full 条件そのものが成立しません。比較器の機能と比較対象の表現範囲を一緒に確認する必要がある理由です。

しきい値 TT では T−1,T,T+1T-1,T,T+1 を優先して確認し、表現範囲外の値は別に扱います。< と <= の違いを意図的に出すテストを作ってください。unsigned のラップアラウンド後の値だけを比較しても、失われたキャリーは復元できません。

自分で考えてみましょう

0~16 の占有数を表す FIFO カウントには何ビット必要ですか。full での同時 pop・push を許すかどうかは、比較式だけで決められますか。

解説を見る

17 個の値を表すので 5 ビット必要です。同時 pop で空く場所に push を受け入れるかは、インターフェースの方針で定めます。count < 16 だけでは full での同時交換を阻止するため、許可するなら pop の実際の受付条件も反映する必要があります。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。