Verilog 的行為級建模(Behavioral Modeling)中的條件語句(Conditional Statements),逐步從基礎到實際工程應用,適合有RTL開發基礎但希望深入行為建模的人。
一、行為級建模簡介
行為級建模(Behavioral Modeling) 是 Verilog 中最接近軟件編程風格的建模方式,描述的是“做什么(What)”,而不是“如何實現(How)”,相比于結構建模、門級建模,它更適合實現復雜控制邏輯、狀態機、時序響應等功能。
通常使用如下塊結構:
always @(*)
(組合邏輯)always @(posedge clk)
(時序邏輯)
二、條件語句概述
條件語句用于在不同條件下執行不同的邏輯,Verilog 中主要包括:
語句類型 | 用途 |
---|---|
if / else | 判斷單個或多個條件 |
case / casex / casez | 多條件選擇分支 |
?: 三元運算符 | 簡化 if 判斷,適合組合邏輯 |
unique / priority case | SystemVerilog 新特性,幫助合成優化 |
三、基礎語法講解
1. if
/ else
語句(最常用)
always @(*) beginif (sel == 1'b0)out = a;elseout = b;
end
多條件嵌套:
always @(*) beginif (a == 1'b1)y = 1;else if (b == 1'b1)y = 2;elsey = 0;
end
注意:組合邏輯中要考慮覆蓋所有條件,否則綜合器可能插入鎖存器(LATCH)。
2. case
語句
always @(*) begincase (sel)2'b00: out = a;2'b01: out = b;2'b10: out = c;default: out = d;endcase
end
適合多分支判斷。優勢在于易讀性與綜合后邏輯優化(如查找表、編碼器等)。
3. casez
/ casex
(支持通配符)
// casez 中 z 表示可以匹配 ‘z’ 或 ‘?’
casez(opcode)6'b1??_??? : action = 1; // 通配6'b000_001: action = 2;default : action = 0;
endcase
?? 警告:casex 會忽略所有 X/Z 位,可能隱藏 bug,建議僅在數據確實存在不確定位時使用。
4. 三元運算符 ?:
assign out = (sel == 2'b00) ? a :(sel == 2'b01) ? b :(sel == 2'b10) ? c : d;
適合結構簡單的組合邏輯,綜合后效率高。
四、工程實踐細節
(1)時序邏輯中使用條件語句
always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt <= 0;else if (cnt_en)cnt <= cnt + 1;
end
使用 if
實現控制狀態機或計數器,是行為級時序邏輯建模的核心方法。
(2)避免鎖存器
以下代碼就會產生 latch(組合邏輯中未覆蓋所有條件):
always @(*) beginif (sel == 2'b00)out = a; // 若 sel 不等于 00,則 out 沒有賦值 -> latch
end
? 正確方式:
always @(*) beginout = 0; // 預設默認值if (sel == 2'b00)out = a;
end
(3)SystemVerilog 推薦用法(可選)
always_comb beginunique case (sel) // 合成優化:編譯器能確定只有一個有效條件2'b00: out = a;2'b01: out = b;default: out = d;endcase
end
unique
、priority
可以提升綜合效率并生成告警(未覆蓋等),但需綜合工具支持(如Vivado、Quartus Prime)。
五、對比表:行為級條件語句使用建議
類型 | 建議場景 | 優勢 | 注意事項 |
---|---|---|---|
if /else | 控制邏輯、狀態機 | 簡單直觀 | 注意不要遺漏條件,防 latch |
case | 多分支選擇 | 易讀、綜合優化 | 要加 default |
?: | 簡短條件賦值 | 合成效率高 | 結構復雜時可讀性差 |
unique | 分支互斥選擇 | 自動檢測遺漏分支 | 綜合器是否支持 |
六、結語與拓展
行為級建模是實現 狀態控制、數據流選擇、算法判斷邏輯 的基礎,條件語句的正確使用能:
- 避免不必要的鎖存器
- 提高可綜合性與時序優化潛力
- 保持邏輯的簡潔清晰