不同抽象级别的 Verilog 模型
以 4 选 1 数据选择器为例,对比门级、RTL 级与行为级三种描述方式
以 4 选 1 数据选择器为例#
4 选 1 数据选择器根据两位控制信号 cntrl1、cntrl2 从四路输入中选择一路输出。
| cntrl1 | cntrl2 | out |
|---|---|---|
| 0 | 0 | in1 |
| 0 | 1 | in2 |
| 1 | 0 | in3 |
| 1 | 1 | in4 |
逻辑表达式:
out = ~c1·~c2·in1 + ~c1·c2·in2 + c1·~c2·in3 + c1·c2·in4
6.1 门级描述#
直接用逻辑门元件例化来描述电路结构,需要先画出逻辑电路图。
Verilog HDL
1 // 4 选 1 MUX — 门级描述
2 module mymux (out, in1, in2, in3, in4, cntrl1, cntrl2);
3 output out;
4 input in1, in2, in3, in4, cntrl1, cntrl2;
5 wire notcntrl1, notcntrl2, w, x, y, z;
6
7 not (notcntrl1, cntrl1); // 对控制信号取反 NOT 门
8 not (notcntrl2, cntrl2);
9 and (w, in1, notcntrl1, notcntrl2); // 00 → in1 AND 门
10 and (x, in2, notcntrl1, cntrl2); // 01 → in2
11 and (y, in3, cntrl1, notcntrl2); // 10 → in3
12 and (z, in4, cntrl1, cntrl2); // 11 → in4
13 or (out, w, x, y, z); // 四路或 OR 门
14 endmodule
NOT 门 内置门元件:not(输出, 输入)
AND 门 and(输出, 输入1, 输入2, 输入3)
OR 门 or(输出, 多路输入)
特点: 最接近电路底层,可读性较低,但综合结果可预测。
6.2 RTL 级描述#
用逻辑表达式(assign)描述数据流,需先写出逻辑函数:
Verilog HDL
1 // 4 选 1 MUX — RTL 级(数据流)描述
2 module mux4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2);
3 output out;
4 input in1, in2, in3, in4, cntrl1, cntrl2;
5
6 assign out = (in1 & ~cntrl1 & ~cntrl2) | assign逻辑表达式
7 (in2 & ~cntrl1 & cntrl2) |
8 (in3 & cntrl1 & ~cntrl2) |
9 (in4 & cntrl1 & cntrl2);
10 endmodule
assign 连续赋值,out 随输入实时更新
逻辑表达式 直接对应真值表的最小项之和
特点: 比门级更简洁,直接对应布尔表达式,综合效率高。
6.3 行为级描述#
只需知道输入输出的真值表关系,无需关心电路内部结构。
用 case 语句#
Verilog HDL
1 // 4 选 1 MUX — 行为级(case 语句)
2 module mux4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2);
3 output out;
4 input in1, in2, in3, in4, cntrl1, cntrl2;
5 reg out;
6
7 always @(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) 敏感列表
8 case ({cntrl1, cntrl2}) // 拼接两位控制信号 位拼接
9 2'b00: out = in1;
10 2'b01: out = in2;
11 2'b10: out = in3;
12 2'b11: out = in4;
13 default: out = 1'bx; default
14 endcase
15 endmodule
敏感列表 所有输入信号均列出,保证组合逻辑正确触发
位拼接 {cntrl1, cntrl2} 拼成 2 位选择信号
default 防止生成隐含锁存器
用条件运算符(最简洁)#
module mux4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2);
output out;
input in1, in2, in3, in4, cntrl1, cntrl2;
assign out = cntrl1 ? (cntrl2 ? in4 : in3)
: (cntrl2 ? in2 : in1);
endmoduleverilog三种描述方式对比#
| 对比项 | 门级 | RTL 级 | 行为级 |
|---|---|---|---|
| 需要了解电路结构 | ✅ 需画逻辑图 | ✅ 需写逻辑表达式 | ❌ 只需知道功能 |
| 代码可读性 | 低 | 中 | 高 |
| 综合结果可控性 | 高 | 中 | 低(由综合器决定) |
| 抽象层次 | 低 | 中 | 高 |
| 典型语句 | and、or、not | assign | always + case/if |
交互演示#
运算符优先级 从高到低
优先级
类别
运算符
说明
1 最高
逻辑 / 位
!~ 单目运算符,优先级最高
2
算术
*/% 乘、除、求模
3
算术
+- 加、减
4
移位
<<>> 左移、右移
5
关系
<<=>>= 所有关系运算符同级
6
等式
==!====!== === 和 !==(case等式)Quartus不支持
7
缩减 / 位
&~& 按位/缩减与、与非
8
缩减 / 位
^^~ 按位/缩减异或、同或
9
缩减 / 位
|~| 按位/缩减或、或非
10
逻辑
&& 逻辑与
11
逻辑
|| 逻辑或
12 最低
条件
? : 三目,优先级最低
💡 建议使用括号明确优先级,如
(a > b) && (b > c)