Verilog和systemverilog中有两种类型的等式运算符:
- 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语句,打印输出
结论:对于等式运算符中的操作数有三态的变量,建议使用“===”和“!==”,如果不清楚等式运算符的操作数是否为三态的,也建议使用“===”和“!==”。