运算符及优先级
全面掌握 Verilog HDL 的九类运算符及其优先级规则
运算符分类#
按功能分为 9 类,按操作数个数分为 3 类:
| 类别 | 运算符 | 操作数 |
|---|---|---|
| 算术运算符 | + - * / % | 双目 |
| 逻辑运算符 | && || ! | 双目 / 单目 |
| 位运算符 | ~ & | ^ ^~ | 单目 / 双目 |
| 关系运算符 | < <= > >= | 双目 |
| 等式运算符 | == != === !== | 双目 |
| 缩减运算符 | & ~& | ~| ^ ^~ | 单目 |
| 移位运算符 | << >> | 单目 |
| 条件运算符 | ? : | 三目 |
| 位拼接运算符 | { } | — |
算术运算符#
5 + 3 // 加法 → 8
5 - 3 // 减法 → 2
5 * 3 // 乘法 → 15
7 / 2 // 整除(舍去小数)→ 3
-11 % 3 // 求模,符号取第一个操作数 → -2verilog若某操作数为不定值
x,则整个结果也为x。
逻辑运算符#
逻辑运算符把操作数视为布尔值,结果为 1 位(0 / 1 / x):
| 操作数 | 被视为 |
|---|---|
| 非零值 | 真(1) |
| 零 | 假(0) |
4'bxx00 | 不确定(x,可能为零) |
4'bxx11 | 真(1,一定非零) |
a && b // 逻辑与
a || b // 逻辑或
!a // 逻辑非(优先级最高)verilog位运算符#
对操作数逐位运算,结果与操作数位数相同:
~A // 按位取反
A & B // 按位与
A | B // 按位或
A ^ B // 按位异或
A ^~ B // 按位同或(XNOR)verilog位数不同时,自动右端对齐,位数少的高位补 0:
// A = 5'b11001, B = 3'b101
// → B 补齐为 5'b00101
A & B // = 5'b00001verilog关系运算符#
结果为 1 位逻辑值(0 / 1 / x):
a < b // 小于
a <= b // 小于等于
a > b // 大于
a >= b // 大于等于verilog若某操作数为
x,则结果为x。
关系运算符优先级低于算术运算符。
等式运算符#
| 运算符 | 说明 | 结果含 x? |
|---|---|---|
== | 逐位相等(x/z 位结果为 x) | 会 |
!= | 不等于 | 会 |
=== | 全等(包含 x、z 的精确比较) | 不会 |
!== | 不全等 | 不会 |
4'b1x0z == 4'b1x0z // → x(不确定)
4'b1x0z === 4'b1x0z // → 1(完全匹配,包括 x 和 z)verilog
===和!==常用于case表达式,又称 case 等式运算符。
⚠️ MAX+PLUS II 和 Quartus II 不支持===/!==。
缩减运算符#
单目运算符,对单个操作数递推运算,最终缩减为 1 位:
reg [3:0] a = 4'b1010;
b = &a; // = ((a[0]&a[1])&a[2])&a[3] → 0
b = |a; // = ((a[0]|a[1])|a[2])|a[3] → 1
b = ^a; // 所有位异或verilog三类运算符对比(A = 4’b1010,B = 4’b1111):
| 类型 | 运算 | 结果 |
|---|---|---|
| 按位运算 | A & B | 4'b1010 |
| 缩减运算 | &A | 1'b0(逐位 AND 缩减) |
| 逻辑运算 | A && B | 1'b1(A、B 均为真) |
移位运算符#
4'b1001 >> 3 // 右移 3 位 → 4'b0001
4'b1001 >> 4 // 右移 4 位 → 4'b0000(移出全丢)
4'b1001 << 1 // 左移 1 位 → 5'b10010(位宽扩充)
4'b1001 << 2 // 左移 2 位 → 6'b100100
1 << 6 // → 32'b1000000verilog移 n 位 ≡ 乘以或除以 2ⁿ;右移数据丢失,左移自动扩展位宽。
条件运算符#
三目运算符,语法:信号 = 条件 ? 表达式1 : 表达式2
// 2 选 1 数据选择器
assign out = sel ? in1 : in0;
// sel=1 → out=in1;sel=0 → out=in0
// 三态门
assign out = enable ? in : 'bz;
// 嵌套实现 4 选 1
assign out = cntrl1 ? (cntrl2 ? in4 : in3)
: (cntrl2 ? in2 : in1);verilog位拼接运算符#
将多个信号的某些位拼接成一个整体:
{a, b[3:0], w, 3'b101}
// = {a, b[3], b[2], b[1], b[0], w, 1'b1, 1'b0, 1'b1}
{cout, sum} = a + b + cin; // 9 位加法结果
{4{w}} // = {w, w, w, w}(重复法)
{b, {3{a, b}}} // = {b, a, b, a, b, a, b}(嵌套)verilog运算符优先级#
运算符优先级 从高到低
优先级
类别
运算符
说明
1 最高
逻辑 / 位
!~ 单目运算符,优先级最高
2
算术
*/% 乘、除、求模
3
算术
+- 加、减
4
移位
<<>> 左移、右移
5
关系
<<=>>= 所有关系运算符同级
6
等式
==!====!== === 和 !==(case等式)Quartus不支持
7
缩减 / 位
&~& 按位/缩减与、与非
8
缩减 / 位
^^~ 按位/缩减异或、同或
9
缩减 / 位
|~| 按位/缩减或、或非
10
逻辑
&& 逻辑与
11
逻辑
|| 逻辑或
12 最低
条件
? : 三目,优先级最低
💡 建议使用括号明确优先级,如
(a > b) && (b > c) 💡 建议:使用括号明确控制优先级,提高可读性:
verilog(a > b) && (b > c) (a == b) || (x == y) (!a) || (a > b)