以下内容对于System Verilog也是适用的。
verilog中有两种类型的等式运算符:logical equality/inequality和case equality/inequality
首先上述表格中四种等式运算符具有相同的优先级,四种运算符会将两个操作数做逐位比较,如果两个操作数的位宽不一致,那么位宽较小的操作数高位补0至与另一操作数位宽一致(适用于verilog,不适用于system verilog),然后再进行比较
对于logical equality和logical inequality运算符(“==”和“!=”),如果操作数中出现x态位或z态位(高阻),那么比较结果将会是1位的x值。
对于case equality和case inequality运算符(“===”和“!===”),不管操作数中有没有x态位或z态位(高阻),比较结果都会是1位确定的值,要么是1要么是0。
同时需要注意在if语句中的条件判断时,对于判断表达式为x态结果是不执行的,例如:
if (a == 1'bx)
$display("test =="); //不管a的值是什么,a == 1'bx的结果都是x态,并且不会执行display语句
if (a === 1'bx)
$display("test ==="); //如果a的值是x,a == 1'bx的结果是1,会执行display语句,打印输出
结论:对于等式运算符中的操作数有三态的变量,建议使用“===”和“!==”,如果不清楚等式运算符的操作数是否为三态的,也建议使用“===”和“!==”。