前言

Verilog语言中case、casex、casez的用法和区别。

提示:以下是本篇文章正文内容,下面案例可供参考

一、case、casex、casez的区别

下表给出case、casex、casez的真值表:

(1)在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。

(2)在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。

(3)在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。

二、case/casez/casex仿真的不同

1)case仿真

case (sel) 
    2'b00:      y = a; 
    2'b01:      y = b; 
    2'bx0:      y = c; 
    2'b1x:      y = d; 
    2'bz0:      y = e; 
    2'b1?:      y = f; 
    default :   y = g; 
endcase

对于case来说,每一种情况都会识别(1/0/z/x)当sel的状态是一下情况时,会出现以下结果:

2)casez仿真

casez,就是会把z/?匹配成任意,也会把任意匹配成z/?的。

casez (sel) 
    2'b00:      y = a; 
    2'b01:      y = b; 
    2'bx0:      y = c; 
    2'b1x:      y = d; 
    2'bz0:      y = e; 
    2'b1?:      y = f; 
    default:    y = g; 
endcase

case的描述,匹配都是从上到下进行的,如果使用了casez,看上面的casez的列表,只要输入有z/?的话,就能和任意匹配。

3)casex仿真

当出现x/z/?的输入的时候,都不会care,只管不是大大(XX)情况来匹配。

casex (sel) 
    2'b00   :   y = a; 
    2'b01   :   y = b; 
    2'bx0   :   y = c; 
    2'b1x   :   y = d; 
    2'bz0   :   y = e; 
    2'b1?   :   y = f; 
    default :   y = g; 
endcase

还是一样的道理,casex也是从上到下匹配,当出现x/z/?的输入的时候,都不会care,只管不是大大情况来匹配。

4) 对于综合、仿真的结果

1)在实际写代码的时候,如果使用case的时候,尽量不要用x/z/?,综合工具也会不care;
2)casez和casex综合的结果是一致的;
3)casez稍好用一些,因为它可以用来代表don’t care的值;
4)最重要的一点就是,casez和casex其实没有孰优孰劣;
5)casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。(所谓不必关心的情况,即在表达式进行比较时,不将该位的状态考虑在内。这样在case语句表达式进行比较时,就可以灵活地设置以对信号的某些位进行比较。)
6) 给个具体应用 例如:在4’b0010和4’b0011想要把从右到左第一次1的位置标出来,就可以用casez ,写成zzz1这样就表示第一位,zz1z就表示第二位这样类推。