JerryMain Island

Back

运算符及优先级

全面掌握 Verilog HDL 的九类运算符及其优先级规则

运算符分类#

功能分为 9 类,按操作数个数分为 3 类:

类别运算符操作数
算术运算符+ - * / %双目
逻辑运算符&& || !双目 / 单目
位运算符~ & | ^ ^~单目 / 双目
关系运算符< <= > >=双目
等式运算符== != === !==双目
缩减运算符& ~& | ~| ^ ^~单目
移位运算符<< >>单目
条件运算符? :三目
位拼接运算符{ }

算术运算符#

5 + 3    // 加法 → 8
5 - 3    // 减法 → 2
5 * 3    // 乘法 → 15
7 / 2    // 整除(舍去小数)→ 3
-11 % 3  // 求模,符号取第一个操作数 → -2
verilog

若某操作数为不定值 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'b00001
verilog

关系运算符#

结果为 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 & B4'b1010
缩减运算&A1'b0(逐位 AND 缩减)
逻辑运算A && B1'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'b1000000
verilog

移 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)

💡 建议:使用括号明确控制优先级,提高可读性:

(a > b) && (b > c)
(a == b) || (x == y)
(!a) || (a > b)
verilog

TUTORIALS