Verilog 运算符比常规的软件编程语言的运算符要复杂的多,也比较难以掌握,不仅涉及到广泛的位操作,还涉及到多值的运算结果。如在Verilog中不仅有数据运算,还涉及到X,Z的与0,1 等的运算结果。本节内容将尽量详细介绍这些运算符的运算规则,并以各种实例展示运算过程和结果,希望帮助大家理解。
Verilog 运算符的分类:
1.按照操作数的多寡分类,可以分为:
单目与多目运算符,具体按照运算符操作数的多少可以将运算符分为三种:
(1)单目运算符(unary operator):
可以带一个操作数,操作数放在运算符的右边。操作数可以为变量,表达式或数值。
单目运算符有: ~ ! + –
~是取反运算符(对向量按位取反)。
!取非运算符,对变量整体评估,
如 wire [3:0] a=4’b1010; ~a的值为4’b0101;
而!a的值为0,或1’b0。对于!a可以这样理解:判断a的是否为零,如果为零,则!a的值为1, 或1’b1; 否则为0,或1’b0。
例:
`timescale 10ns/1ns
module tb ( );
reg [3:0] ta, tb;
wire [3:0] tc, td;
initial
begin
#100
ta = 4'b0101;
tb = 4'b0101;
#20
ta = 4'b0000;
tb = 4'b0000;
#20
ta = 4'b1111;
tb = 4'b1111;
end
test test_inst
(
.a (ta),
.b (tb),
.c (tc),
.d (td)
);
endmodule
module test
(
input [3:0] a,
input [3:0] b,
output [3:0] c,
output [3:0] d
);
assign c = ~a;
assign d = !b;
endmodule
仿真结果如图1,

图1
单目运算符在单个bit变量求值时,运算结果位宽仍然是一位。在对向量求值时,~按位取反,得到与原变量同等位宽的值,而!是对整个向量评估,如果向量为0,则结果为1’b1;如果原变量不为零,则结果为1’b0;
+,-在这里表示符号运算,+表示正数,-表示负数。一般放在十进制数的前面。
还有4个运算符既可以作为单目运算符使用,也可以作为双目运算符使用。作为单目运算符使用时,意义如下:
& 按位与,| 按位或, ^ 按位异或,^~ 按位同或(异或非)
&a[3:0] , 等同于a[0] & a[1] & a[2] & a[3]; 逐位相与求结果,结果位宽为1.
|a[3:0], 等同于a[0] | a[1] | a[2] | a[3]; 逐位相或求结果,结果位宽为1.
^a[3:0], 等同于a[0] ^ a[1] ^ a[2] ^ a[3]; 逐位异或求结果,结果位宽为1.
^~a[3:0], 等同于a[0]^~a[1]^~a[2]^~ a[3];逐位同或(异或非)求结果,结果位宽为1.
(2) 二目运算符(binary operator):
可以带二个操作数,操作数放在运算符的两边。
二目运算符有:&& ,|| ,+,–,* ,/,% ,&,|,==,>=, >, <=, <等,其中&&为逻辑与,|| 为逻辑或,
(3) 三目运算符(ternary operator):
可以带三个操作,这三个操作数用三目运算符分隔开。
三目运算符有选择运算符?
r = s ? t : u;
单目或多目运算符的使用见下例:
clock = ~clock; // ~是一个单目取反运算符, clock是操作数。
c = a | b; // 是一个二目按位或运算符, a 和 b是操作数。
r = s ? t : u; // ? : 是一个三目条件运算符, s,t,u是操作数。
2. 按照功能分类,可以分类如下:
a.按位运算符(bitwise operator)
& | ~ 按位 与、或及取反运算符
b.逻辑运算符(logic operator)
&& || ! 逻辑 与 、或、非
c.关系运算符(relation operator)
> >= < <= 大于,大于等于,小于,小于等于
d.等式运算符 (Equality operator)
== != === !== 等于,不等,全等,非全等
e.移位运算符 (shift operator)
<< >> 左移,右移, <<<,>>>带符号操作数的左右移
f.并位运算符 (concatenation operator)
{ } 并位运算符 或位拼接运算符。
g. 选择运算符 (selection operator)
?选择运算符
h. 符号运算符 (sign operator)
+(正),-(负)
i.算数运算符(arithmetic operator)
+(加),-(减) ,*(乘),/(除),%(求余),**(指数或求幂)
j. 规约运算符
&,| ,^ 也称缩减运算符
例如: &a[3:0] 等效为 a[3]&a[2]&a[1]&a[0];
后面将按照章节分别介绍各个运算符的使用。
对应视频:
学习本篇文章后有几点收获,1、按照操作数的多寡分为:单目运算符(~ ! + – )、二目运算符(&& ,|| ,+,–,* ,/,% ,&,|,==,>=, >, <=, <)、三目运算符(?);2、按照功能分类:按位运算符、逻辑运算符、关系运算符、等式运算符、移位运算符、并位运算符、选择运算符 、符号运算符、算数运算符、规约运算符;
文章对各类运算符进行了全面汇总,非常便于日常编程时查阅,谢谢老师!