Altifigence Academy

18 / 63 · 概念

比較器與邊界值規格

區分同一位元序列的 unsigned 與 signed 比較,驗證邊界條件。

大小由最高的相異位元決定

比較兩個 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 詳細內容 向量時,從 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);

此程式假設兩運算元寬度相同。若寬度不同,單純 cast 之前,必須先決定擴展到哪個寬度。

同一對位元序列,也會因符號契約不同而顛倒順序。不要把 unsigned 從高位比較的規則原封不動套用到 signed 值。

比較位元序列前,先確定解讀方式
  1. 1111 與 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 回捲後的值,無法還原早已遺失的 carry。

自己試試看

FIFO 計數器要表示 0~16 的佔用量,需要幾個位元?full 時是否允許 pop 與 push 同時發生,能只由比較式決定嗎?

查看解說

共需表示 17 個值,因此要 5 位元。同時有 pop 時是否可在空出的位置接受 push,必須由介面政策決定。只用 count < 16 可能禁止 full 時的同時交換;若要允許,還需納入 pop 實際被接受的條件。

此選擇適用於本瀏覽器,隨時可從頁尾變更。