Verilog中的case equality表达式

-- TOC --

Verilog代码比较相等或不相等,有logic equality方式,也有case equality方式,本文介绍后者。

Verilog中有两种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和?是等效的。

哪些bit值可以是true?

上面的测试代码还随带做了一个小测试,对 0,1,x,z,?, 这5个值,测试其true or false。结果也是非常明显的:

在Verilog中,只有1是true,其它都是false!

本文链接:https://cs.pynote.net/hd/verilog/202109171/

-- EOF --

-- MORE --