背景
在写sv的代码时,经常遇到==,!=,===,!==, &,|, &&,||这样的关系运算符,这些关系掌握的不清楚,每次用到都要搜索或者查书,但是很多网站多以文字描述,个人任务最好的是针对每个关系运算符出一个真值表,方便理解
对于每一种关系运算符,先搞清楚单比特运算是基础,多比特在单比特基础上做运算
1.“&" 按位与运算符
& | 0 | 1 | x | z |
0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | x | x |
x | 0 | x | x | x |
z | 0 | x | x | x |
对于多比特数的&运算,把每一位相与,然后结果写下来,组成的数就是最终结果
2.”|“ 按位或运算符
| | 0 | 1 | x | z |
0 | 0 | 1 | x | x |
1 | 1 | 1 | 1 | 1 |
x | x | 1 | x | x |
z | x | 1 | x | x |
对于多比特数的&运算,把每一位相或,然后结果写下来,组成的数就是最终结果
需要明确:“==”,“!=”,“===”,“!==” 最终的返回结果都是单笔特数
“==”和“!=” 运算符的返回值有0,1,x,z四种状态
“===”和“!==” 的返回值只有0和1两种状态
3. “==” 运算符
可以用于四值逻辑运算符的关系运算,四值逻辑即0,1,x,z
单比特运算逻辑:两个单比特数,如果为0或1,相等则返回1,不等返回0; 只要其中一个为x或z,结果为x
== | 0 | 1 | x | z |
0 | 1 | 0 | x | x |
1 | 0 | 1 | x | x |
x | x | x | x | x |
z | x | x | x | x |
多比特运算逻辑:
例子:(4'b1111 == 4'b111x1) 结果为x
(4'b1010 == 4'b10x1) 结果为0
这样的结果也是符合逻辑的
4.“!=” 运算符
单比特运算逻辑:两个单比特数,如果为0或1,不等则返回1,相等返回0; 只要其中一个为x或z,结果为x
!= | 0 | 1 | x | z |
0 | 0 | 1 | x | x |
1 | 1 | 0 | x | x |
x | x | x | x | x |
z | x | x | x | x |
多比特运算逻辑:
例子:(4'b1011 != 4'b1001) 结果为1
(4'b1010 != 4'b10x1) 结果为1
这样的结果也是符合逻辑的,因为不管x是什么,最后以为0和1都不会相等
5. “===” 运算符
=== | 0 | 1 | x | z |
0 | 1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 |
x | 0 | 0 | 1 | 0 |
z | 0 | 0 | 0 | 1 |
6.“!==” 运算符
=== | 0 | 1 | x | z |
0 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 1 |
x | 1 | 1 | 0 | 1 |
z | 1 | 1 | 1 | 0 |
结论:
- ===和!==是将两边的数逐位进行比较,只要长得不一样,就算不相等
- === 运算符两边的数,只要有一位不一样,结果就为0,必须每一位都一模一样,才返回1,否则为0
- !==运算符两边的数,只要有一位一样,结果就为1,只有每一位全都一样,结果才为0
7. (待补充)
部分内容参考自大佬的文章:
【SystemVerilog基础】SystemVerilog语法之逻辑等(==)、全等(===)和匹配等(==?)_systemverilog ===-CSDN博客