Verilog語言中case、casex、casez的用法和區(qū)別
casez與casex語句是case語句的兩種變體, 在寫testbench時用到。
一、case、casex、casez的區(qū)別
下表給出case、casex、casez的真值表:
在case語句中,敏感表達式中與各項值之間的比較是一種全等比較,每一位都相同才認(rèn)為匹配。
在casez語句中,如果分支表達式某些位的值為高阻z,那么對這些位的比較就會忽略,不予考慮,而只關(guān)注其他位的比較結(jié)果。
在casex語句中,則把這種處理方式進一步擴展到對x的處理,即如果比較雙方有一方的某些位的值是z或x,那么這些位的比較就不予考慮。
二、case/casez/casex 在simulation/synthesis的區(qū)別
有的網(wǎng)上說casex和casez屬于不可綜合語句,這是針對一般電路不會出現(xiàn)x狀態(tài)來說的,但是綜合工具并不會對x,z認(rèn)識這個狀態(tài),所以綜合出來的電路是一樣的。
使用過程中許需要注意的問題:
1)一般經(jīng)常使用到的是casez語句,最好少用casex
2)case/casez/casex其實都是可綜合的
3)在電路中,可以用?來表示無關(guān)值的z
4)case的描述,匹配都是從上到下進行的
仿真的不同
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)
當(dāng)sel的狀態(tài)是一下情況時,會出現(xiàn)以下結(jié)果
2)對于casez
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
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也是從上到下匹配,當(dāng)出現(xiàn)x/z/?的輸入的時候,都不會care,只管不是大大情況來匹配
綜合的不同
綜合的時候,因為綜合工具其實都不會管你什么x/z/?,對于綜合工具來說是一樣的,所以case/casez/casex不同寫法的綜合結(jié)果,例子都是同樣的。
例一:
case (sel)
2'b00 : mux_out = mux_in[0];
2'b01 : mux_out = mux_in[1];
2'b1? : mux_out = mux_in[2];
default : mux_out = mux_in[3];
endcase
例二:
case (sel)
2'b00 : mux_out = mux_in[0];
2'b01 : mux_out = mux_in[1];
2'b1x : mux_out = mux_in[2];
default : mux_out = mux_in[3];
endcase
這倆個例子的結(jié)果是一樣的。
case(不是casez/casex的時候)的列表里面的x和z,都被綜合工具認(rèn)為是不可達到的狀態(tài)就被去掉了。casez和casex里面的x/z都被認(rèn)為是don’t care。
對于綜合、仿真的結(jié)果
1)在實際寫代碼的時候,如果使用case的時候,盡量不要用x/z/?,綜合工具也會不care
2)casez和casex綜合的結(jié)果是一致的。
3)casez稍好用一些,因為它可以用來代表don’t care的值
4)最重要的一點就是,casez和casex其實沒有孰優(yōu)孰劣
5)casez語句用來處理不考慮高阻值z的比較過程,casex語句則將高阻值z和不定值都視為不必關(guān)心的情況。所謂不必關(guān)心的情況,即在表達式進行比較時,不將該位的狀態(tài)考慮在內(nèi)。這樣在case語句表達式進行比較時,就可以靈活地設(shè)置以對信號的某些位進行比較。
更多信息可以來這里獲取==>>電子技術(shù)應(yīng)用-AET<<