-- TOC --
Verilog代码比较相等或不相等,有logic equality方式,也有case equality方式,本文介绍后者。
这两个equality表达式分别是 ==
和 ===
,当然对应的inequality分别是 !=
和 !==
。搞清楚前者,后者自然也就清楚了。
==
, 被称为logic equality,逻辑上的相等判断,当两边的数值存在x或者z(?)的时候,这在逻辑上就是无法判断结果,因此==的结果就一定是x,不确定。
===
,被称为case equality,对两边的数值进行case by case的比较,即按位比较,此时x或者z(?)也会被当成值来进行比较,因此总能够得到0或者1的结果。
x在Verilog中表示不确定状态,z表示高阻态,z也可以用
?
来表示。
写了一段简单的代码测试这两种比较:
module test_equality();
reg [3:0] a = 4'b0000;
reg [3:0] b = 4'b0001;
reg [3:0] c = 4'b000x;
reg [3:0] d = 4'b000z;
reg [3:0] e = 4'b000?;
initial begin
$display("logic");
$display(a==a);
$display(a==b);
$display(a==c);
$display(a==d);
$display(a==e);
$display("case");
$display(a===a);
$display(a===b);
$display(a===c);
$display(a===d);
$display(a===e);
if (a[0]) $display("a[0] is true!");
else $display("a[0] is false!");
if (b[0]) $display("b[0] is true!");
else $display("b[0] is false!");
if (c[0]) $display("c[0] is true!");
else $display("c[0] is false!");
if (d[0]) $display("d[0] is true!");
else $display("d[0] is false!");
if (e[0]) $display("e[0] is true!");
else $display("e[0] is false!");
if (4'b0x1z === 4'b0x1?) $display("4'b0x1z === 4'b0x1? is true!");
else $display("4'b0x1z === 4'b0x1? is false!");
end
endmodule
在ModelSim上仿真的结果:
# logic
# 1
# 0
# x
# x
# x
# case
# 1
# 0
# 0
# 0
# 0
# a[0] is false!
# b[0] is true!
# c[0] is false!
# d[0] is false!
# e[0] is false!
# 4'b0x1z === 4'b0x1? is true!
从打印出来的结果来看,logic equality,==
,存在结果为x的情况;case equality, ===
, 结果非0即1。而且,z和?是等效的。
上面的测试代码还随带做了一个小测试,对 0,1,x,z,?,
这5个值,测试其true or false。结果也是非常明显的:
在Verilog中,只有1是true,其它都是false!
本文链接:https://cs.pynote.net/hd/verilog/202109171/
-- EOF --
-- MORE --