Verilog语法中等式运算符包含==,!=,===以及!==等4种;该四种运算符也属于关系运算符的范畴。由于具有一些特殊性,这里将等式运算符作特别讨论。
1) ==,!= 运算符
== 运算符表示比较的变量是否相等,相等为1或真(true),不相等为0,或假(false)。
!= 运算符表示比较的两个变量是否不相等,不相等为1或真(true),相等为0,或假(false)。
比较的结果可以作为值赋值给其它变量,也可以作为if,case,?等语句的判断条件使用。
与关系运算符一样,如果比较双方变量,有一个包含Z或X,则比较的结果为X。
例:
module test ( input a, input b, input [3:0] c, input [3:0] d, output [3:0] e, output [3:0] f ); wire comp; assign comp = a != b; assign e = (a == b) ? c : d; assign f = comp ? c : d; endmodule
从上面的例子可以看出,等式运算符组成的表达式可以赋值给变量,如:assign comp = a != b;,也可以直接用在判断语句作为判断条件,如:assign e = (a==b) ? c : d;
下面是testbench文件给出激励文件,观察在a,b 的值不为X,Z的时候,e,f的值,以及在a,b为X或Z时,comp,e,f的值。
`timescale 10ns/1ns module tb ( ); reg ta, tb; reg [3:0] tc, td; wire [3:0] te, tf; initial begin ta = 1'b1; tb = 1'b0; tc = 4'b0001; td = 4'b1000; #20 tb = 1'b1; #20 ta = 1'bx; #20 tb = 1'bx; #20 ta = 1'bz; tb = 1'b1; #20 tb = 1'b0; #20 tb = 1'bz; #20 tb = 1'bx; #20 ta = 1'bx; end test test_inst ( .a (ta), .b (tb), .c (tc), .d (td), .e (te), .f (tf) ); endmodule
Modelsim的仿真结果如下图:
图1
从上面的图1可以看出,无论a,b中哪一个出现了X,Z,comp的结果都是X,
并不是a,b的值都为X,比较结果会返回1.
而e,f的值却非常有意思,并不是在判断条件为X时,e,f的值全部都为4’bXXXX;而是4’bX00X;这个值是如何得到的呢?
首先当判断条件出现X时,语句“assign e = (a==b) ? c : d; ”中的e不能确定自己的结果来自c 还是d, 但如果c,d值中有某些位的值相同,则e对应的这些位是确定的,如c为4’b1000,d为4’b0001,c与d的中间两位相同,因此无论最后是c赋给了e,还是d赋给了e,中间两位都为00,因此结果就可以解释了。
2) 等式运算符===,!==
===又称为全等运算符,只有比较的两边对应的位完全相等才返回1或真(true),否则返回0或假(false)。
!==为非全等运算符,运算结果与“===”的运算结果相反。
注意:全等比较符不仅0,1参与比较,X,Z也是比较的成员,如 a的值为1‘bX,b的值也为1’bX , 则a===b的返回值为1或真(true).
将上面的代码修改后,再看仿真结果,并比较与==,!=的结果有何不同。
module test ( input a, input b, input [3:0] c, input [3:0] d, output [3:0] e, output [3:0] f ); wire comp; assign comp = a !== b; assign e = (a === b) ? c : d; assign f = comp ? c : d; endmodule
Testbench 激励程序
`timescale 10ns/1ns module tb ( ); reg ta, tb; reg [3:0] tc, td; wire [3:0] te, tf; initial begin ta = 1'b1; tb = 1'b0; tc = 4'b0001; td = 4'b1000; #20 tb = 1'b1; #20 ta = 1'bX; #20 tb = 1'bX; #20 ta = 1'bZ; tb = 1'b1; #20 tb = 1'b0; #20 tb = 1'bZ; #20 tb = 1'bX; #20 ta = 1'bX; end test test_inst ( .a (ta), .b (tb), .c (tc), .d (td), .e (te), .f (tf) ); endmodule
Modelsim 仿真结果
图2
从图2可以看出,===与==,!== 与 !=的仿真结果完全不同。
注:在数字电路中,如果只是0,1的二值比较,=== 与 ==,!== 与 !=是相同的。
对应视频:
学习本篇文章后有几点收获,1、==,!= 运算符,如果比较双方变量,有一个包含Z或X,则比较的结果为X;2、当判断条件出现X时,“assign e = (a==b) ? c : d; ”中的e不能确定自己的结果来自c 还是d, 但如果c,d值中有某些位的值相同,则e对应的这些位是确定的;3、全等比较符不仅0,1参与比较,X,Z也是比较的成员;
文章对两种类型的等式运算符分别进行分析,通过仿真波形可以非常清晰的看到两种等式运算符对X、Z的情况,会产生完全不同比较结果。文章的举例很有典型性,感谢老师的精心编写!