Altifigence Academy

5 / 37 · 概念

logic、wire、X/Z 與明確的位元寬度

區分型別宣告與儲存器件,檢查常量、比較、擴展和未知值。

型別、驅動來源和儲存是不同問題

logic 是四狀態資料型別,wire 表示 net 連線,net 也可傳遞四狀態值。logic 變數在驅動規則允許時可用於組合結果或時脈狀態,名稱本身不保證正反器。找出實際連續賦值、組合過程或時脈邊緣過程。普通 RTL 訊號使用一個預期驅動來源;解析多驅動 net 與雙向介面需另立電氣和工具契約,不在這些單驅動例子的範圍內。

明確位元寬度與解釋

logic [7:0] u 是無號 8 位,logic signed [7:0] s 是以二的補數解釋的同樣 8 位。8'hFF 在 u 中是 255,在 s 中是 −1。packed 向量同時傳遞位,不是時間上連續的八個值。

SystemVerilog
module typed_examples (
  input  logic [3:0] a, b,
  input  logic signed [7:0] s,
  output logic [4:0] full_sum,
  output logic signed [8:0] extended_s,
  output logic negative,
  output logic any_bit, all_bits, parity
);
  assign full_sum = {1'b0, a} + {1'b0, b};
  assign extended_s = {s[7], s};
  assign negative = s < 8'sd0;
  assign any_bit = |a;
  assign all_bits = &a;
  assign parity = ^a;
endmodule

extended_s 重複符號位。只添一個 0 會把 −1 變成 +255。串接運算式是無號的,對其做有號算術要顯式轉換或用正確宣告的中間值;這裡把預期位模式賦給有號目標。依賴位元寬度時使用 4'd15、8'hFF、8'sd0 這樣的定寬常量。未定寬整數可擴展運算式,不能假定左運算元決定全部型別,要檢查兩端及賦值上下文。

區分三類運算子

a & b 按位運算,a && b 判斷兩個向量是否邏輯為真並回傳一位,&a 判斷所有位是否為 1。a=0011,b=0101 時依次為 0001、1、0;^a 是奇偶校驗,0011 得 0。把不清楚的寬度或符號拆成中間訊號,便於給每個訊號規定範圍。

未知不是第三種物理電壓

X 表示未知,Z 表示高阻驅動,都是模擬值,不對應某個準確電壓。二狀態執行不能證明四狀態行為。不要把所有 X 隱藏成 0,應在四狀態測試平台中明確重置。== 在無法判斷時可能得到 X;測試中的 actual !== expected 能把已知期望與 X/Z 的比較判為明確不匹配。case equality 不意味著普通硬體能檢測物理 X。

練習:擴展、加法與比較

a=15,b=1 時 full_sum=10000。s=8'h80 時 extended_s=110000000,negative=1;s=8'h7F 時 extended_s=001111111,negative=0。分別測 0、最大正數、最小負數、−1。改成 {1'b0,s} 並確認負數測試失敗。把 !== 改成 !=,向 actual 注入 X,觀察條件是否可靠報告失敗;檢查結果本身未知可能漏報。

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