Verilog中关系运算符有>, 大于;>= ,大于等于;< ,小于;<=,小于等于。还有四个等式运算符==,!=,===,!==也可并入关系运算符。但由于他们有些特殊性,特别是===及!==对X,Z的比较运算结果,有独特的规则,而且运算优先级也不同,因此我们把等式运算符分开讨论。
由关系运算符组成的表达式,其结果是二值0,1;或TRUE ,FALSE;该值可以在赋值语句中赋给其它变量,也可以用在判断语句中,如 if语句, case语句, 选择语句中 “?”。还可以利用逻辑运算符将不同的运算结果组成更复杂的表达式。
例:
module test
(
input [3:0] a,
input [3:0] b,
output [3:0] c,
output [3:0] d,
output e, f, g
);
assign c = a > b;
assign d = a <= b;
assign e = a > b;
assign f = a <= b;
assign g = a < b;
endmodule
Testbench 程序如下:
`timescale 10ns/1ns
module tb
(
);
reg [3:0] ta, tb;
wire [3:0] tc, td;
wire te, tf, tg;
initial
begin
#10
ta = 4'b1101;
tb = 4'b0101;
#20
ta = 4'b0000;
tb = 4'b1000;
#20
ta = 4'b1111;
tb = 4'b1111;
end
test test_inst
(
.a (ta),
.b (tb),
.c (tc),
.d (td),
.e (te),
.f (tf),
.g (tg)
);
endmodule
Modelsim的仿真结果如图1,

图1
从modelsim的仿真波形可以看出,两个向量(vector)型变量如a[3:0],b[3:0]比较时,其结果是1bit的逻辑值0,1或true ,false二值逻辑,虽然可以赋值给向量型变量或端口,只是利用位扩展的方式实现的,如上例中c,d在比较结果为真时,只有最低位为1,其它位都为零,如图1中tc==4’b0000或4‘b0001。
如果在关系运算符中包含有Z,X值,结果会如何?
在关系运算中,无论1,0,Z,X任何值,在与 值Z或X运算时,其结果皆为X。
例:设a,b两个wire型变量,y = a > b结果如下:
表1:
| 关系运算符 “>” y = a > b; | ||
| a | b | y |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
表2
| 关系运算符 “>” y = a > b; | ||
| a | b | y |
| 1 | Z/X | X |
| 1 | Z/X | X |
| 1 | Z/X | X |
| 1 | Z/X | X |
表3
| 关系运算符 “>” y = a > b; | ||
| a | b | y |
| 0 | Z/X | X |
| 0 | Z/X | X |
| 0 | Z/X | X |
| 0 | Z/X | X |
其它>=,<,<=的比较结果与上面的> 在有Z或X参与运算时一样,其结果都是X;
在向量的关系运算中,只要比较的两个变量中有一个含有X或Z,其结果都为X;
例:
module test
(
input [3:0] a,
input [3:0] b,
output [3:0] c,
output [3:0] d,
output e, f, g,
output h
);
assign c = a > b;
assign d = a <= b;
assign e = a > b;
assign f = a <= b;
assign g = a > b;
assign h = a[0] > b[0];
endmodule
Testbench
`timescale 10ns/1ns
module tb
(
);
reg [3:0] ta, tb;
wire [3:0] tc, td;
wire te, tf, tg;
wire th;
initial
begin
#10
ta = 4'b1101;
tb = 4'b0101;
#20
ta = 4'b0000;
tb = 4'b1001;
#20
ta = 4'b1111;
tb = 4'b1111;
#20
tb = 4'b1110;
#20
tb = 4'b111x;
#20
tb = 4'b111z;
#20
ta = 4'b1110;
#20
tb = 4'b111x;
end
test test_inst
(
.a (ta),
.b (tb),
.c (tc),
.d (td),
.e (te),
.f (tf),
.g (tg),
.h (th)
);
endmodule
Modelsim 的仿真结果如图2:

图2
从上面的波形可以证实上面的分析结果。
对应视频:
学习本篇文章后有几点收获,1、在关系运算中,无论1,0,Z,X任何值,在与 值Z或X运算时,其结果皆为X;2、在向量的关系运算中,只要比较的两个变量中有一个含有X或Z,其结果都为X;3、两个向量型变量比较时,其结果是1bit的逻辑值0,1或true ,false二值逻辑;
文章对X、Z的情况做了全面论证,学习后感觉对关系运算符有了更深入的理解。