JerryMain Island

Back

不同抽象级别的 Verilog 模型

以 4 选 1 数据选择器为例,对比门级、RTL 级与行为级三种描述方式

以 4 选 1 数据选择器为例#

4 选 1 数据选择器根据两位控制信号 cntrl1cntrl2 从四路输入中选择一路输出。

cntrl1cntrl2out
00in1
01in2
10in3
11in4

逻辑表达式: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);
endmodule
verilog

三种描述方式对比#

对比项门级RTL 级行为级
需要了解电路结构✅ 需画逻辑图✅ 需写逻辑表达式❌ 只需知道功能
代码可读性
综合结果可控性低(由综合器决定)
抽象层次
典型语句andornotassignalways + case/if

交互演示#

运算符优先级 从高到低
优先级
类别
运算符
说明
1 最高
逻辑 / 位
!~
单目运算符,优先级最高
2
算术
*/%
乘、除、求模
3
算术
+-
加、减
4
移位
<<>>
左移、右移
5
关系
<<=>>=
所有关系运算符同级
6
等式
==!====!==
=== 和 !==(case等式)Quartus不支持
7
缩减 / 位
&~&
按位/缩减与、与非
8
缩减 / 位
^^~
按位/缩减异或、同或
9
缩减 / 位
|~|
按位/缩减或、或非
10
逻辑
&&
逻辑与
11
逻辑
||
逻辑或
12 最低
条件
? :
三目,优先级最低
💡 建议使用括号明确优先级,如 (a > b) && (b > c)

TUTORIALS