Casex vs Casez in Verilog

2019-08-14 21:11发布

问题:

what is the difference between casex and casez in Verilog ? I have searched about it and find this sentence :

casez treats all z values in the case alternatives or the case expression as don't cares. All bit positions with z can also represented by ? in that position.

casex treats all x and z values in the case item or the case expression as don't

cares.

for example , what is the difference between first one and second one:

1-

casez (instr)
7'b1zzzzzzz: // arithmetic
7'b01zzzzzz: // load-reg
7'b00zzzzzz: // store-reg
endcase

2-

 casex (instr)
    7'b1zxxxxzz: // arithmetic
    7'b01zzxxxx: // load-reg
    7'b00xxxzzz: // store-reg
    endcase

回答1:

The Verilog Language Reference Manual (now replaced by the SystemVerilog LRM) explains this in great detail. The key difference is when the case expression instr contains x or z values. Remember that both casex and casez look at both the case item and the case expression for x and z values. We call this a symmetric comparison as don't care values can show up in either place.

So if instr was all x's, none of the items in the casez would match, but ALL of the items in the casex would match, and a simulator would pick the first item. Similarly, if instr were all z's, then ALL items would match. I consider casex a useless construct.

SystemVerilog replaces both statements with a case() inside statement. It uses an asymmetric comparison operator ==? that only treats an x or z in the case item as a don't care.



标签: verilog