Verilog运算符
1、逻辑运算符
- && 逻辑与
- || 逻辑或
- ! 逻辑非
其中&&、||优先级低于关系运算符,而!运算符高于算数运算符,因此
(a > b) && (x > y) 可以写成: a > b && x > y
(a == b) || (x == y) 可以写成: a == b || x == y
(!a) || (a > b) 可以写成:!a || a > b
为了增加程序可读性,一般使用括号
2、关系运算符
- < 小于
- > 大于
- <= 小于等于
- >= 大于等于
如果关系是真的(true)返回的值为1,如果关系是假的(false)返回的值位0。所有关系运算符优先级是一致的,都低于算数运算符,如
a < size - 1 等效于: a < (size - 1)
size - (1 < a) 不等效于: size - 1 < a //前者表示size,减了0或者1;后者表示size减1后再与a比较
3、等式运算符
- == 等于
- != 不等于
- === 全等
- !== 不全等
全等(===)与等于(==)操作符差异在于,后者对于不定值x和高阻态z量的比较结果可能是不定值x;而前者能比较含有x和z的量,结果只有真或假两种状态,如下表所示
=== | 0 | 1 | x | z | == | 0 | 1 | x | z |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | x | x |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | x | x |
x | 0 | 0 | 1 | 0 | x | x | x | x | x |
z | 0 | 0 | 0 | 1 | z | x | x | x | x |
4、移位运算符
- << 左移
- >> 右移
两种移位运算符都使用0来填补移出来的空位,如
a >> n //将a向右移动n位
b << n
4’b1001 << 1 = 5'b10010
4’b1001 << 2 = 6'b100100
1 << 6 = 32'b1000000
4'b1001 >> 1 = 4'b0100
5、位拼接运算符
- {} 拼接运算符
该运算符能将多个数据按位拼接在一起,但需要指明数的宽度,如
//以下例子的表达式a, b均为常数表达式
{a, b[3:0], 3'b101} //将这三个数据拼接在一起
{3{a}} //拼接运算符中可以使用重复法,相当于{a, a, a}
{a, {2{a, b}}} //拼接可以嵌套使用
6、运算符优先级
运算符 | 优先级 |
---|---|
! ~ | 高 |
* / % | |
+ - | |
<< >> | |
< <= > >= | |
== != === !== | |
& | |
^ ^~ | |
| | |
&& | |
|| | |
?: | 低 |