Menu Close

Verilog 等式运算符

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的仿真结果如下图:

%title插图%num

图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 仿真结果

 

%title插图%num

图2

从图2可以看出,=====!==!=的仿真结果完全不同。

注:在数字电路中,如果只是0,1的二值比较,=====!==!=是相同的。

 

对应视频:

Posted in FPGA, FPGA 教材教案, Verilog, Verilog

1 Comment

  1. wangff

    学习本篇文章后有几点收获,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的情况,会产生完全不同比较结果。文章的举例很有典型性,感谢老师的精心编写!

发表回复

相关链接