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 @(*) begin
if (sel == 1'b0)
out = a;
else
out = b;
end
多条件嵌套:
always @(*) begin
if (a == 1'b1)
y = 1;
else if (b == 1'b1)
y = 2;
else
y = 0;
end
注意:组合逻辑中要考虑覆盖所有条件,否则综合器可能插入锁存器(LATCH)。
2. case
语句
always @(*) begin
case (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) begin
if (!rst_n)
cnt <= 0;
else if (cnt_en)
cnt <= cnt + 1;
end
使用 if
实现控制状态机或计数器,是行为级时序逻辑建模的核心方法。
(2)避免锁存器
以下代码就会产生 latch(组合逻辑中未覆盖所有条件):
always @(*) begin
if (sel == 2'b00)
out = a; // 若 sel 不等于 00,则 out 没有赋值 -> latch
end
✅ 正确方式:
always @(*) begin
out = 0; // 预设默认值
if (sel == 2'b00)
out = a;
end
(3)SystemVerilog 推荐用法(可选)
always_comb begin
unique 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 |
分支互斥选择 | 自动检测遗漏分支 | 综合器是否支持 |
六、结语与拓展
行为级建模是实现 状态控制、数据流选择、算法判断逻辑 的基础,条件语句的正确使用能:
- 避免不必要的锁存器
- 提高可综合性与时序优化潜力
- 保持逻辑的简洁清晰