18 / 63 · 概念
比較器與邊界值規格
區分同一位元序列的 unsigned 與 signed 比較,驗證邊界條件。
單元可免費閱讀,註冊課程即可儲存學習進度。
大小由最高的相異位元決定
比較兩個 unsigned無符號(unsigned)將位元序列解讀為非負整數。n 位元範圍為 0 至 2^n−1;相同位元序列的帶符號解讀可能得到不同數值。 詳細內容 向量時,從 MSBMSB是位權最高的位元。索引編號會隨向量的宣告方向而異,因此不能一律假設它的編號最大。 詳細內容 起找第一個不同位元;該位為 1 的一方較大。令 ,4 位元的大於條件如下。
左側 是比較結果的布林值。只有更高位全部相等時,較低位的比較才影響結果。相等比較則是所有 的 AND。
Signed 比較先解讀符號
4'b1111 與 4'b0001 以 unsigned 解讀為 15 與 1,以 signed 解讀則是 −1 與 1。符號不同時,負數較小。logic [3:0] 與 logic signed [3:0] 的差別不是儲存容量,而是運算採用的解讀方式。
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 值。
- 1111 與 0001: 相同的 4 位元輸入
- 無符號: 15 大於 1
- 帶符號: −1 小於 1
用文字固定邊界條件
可存 16 個項目的緩衝區中,count==16 為 full,count<16 表示還能存入。若 count 只有 4 位元,無法表示 16,full 條件本身就會失效。這就是為何要同時審查比較器功能與被比較值的表示範圍。
門檻為 時,優先確認 ,超出表示範圍的值另行處理。刻意設計能區分 < 與 <= 的測試。只比較 unsigned 回捲後的值,無法還原早已遺失的 carry。
自己試試看
FIFO 計數器要表示 0~16 的佔用量,需要幾個位元?full 時是否允許 pop 與 push 同時發生,能只由比較式決定嗎?
查看解說
共需表示 17 個值,因此要 5 位元。同時有 pop 時是否可在空出的位置接受 push,必須由介面政策決定。只用 count < 16 可能禁止 full 時的同時交換;若要允許,還需納入 pop 實際被接受的條件。