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 向量同時傳遞位,不是時間上連續的八個值。
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;
endmoduleextended_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,觀察條件是否可靠報告失敗;檢查結果本身未知可能漏報。