1、語法說明
在rtl仿真中,有四種狀態(tài),分別是0、1、x(unknown values)和z(high-impedance values)。
case 結(jié)構(gòu)體中:0,1,X與Z是四種不同的狀態(tài),case條件比較時會檢測比較雙方每個bit是否完全相等。
casez 結(jié)構(gòu)體中:把Z當(dāng)做don’t care conditions,case條件比較時,比較雙方存在Z值的bit位不參與比較 ,其他比特位相等則視為條件命中
casex 結(jié)構(gòu)體中:把Z和X當(dāng)做don’t care conditions,case條件比較時,比較雙方存在Z或者X的bit位不參與比較,其他比特位相等則視為條件命中
在SystemVerilog和Verilog中,
case、casex、casez都是可綜合的
在casex、casez中推薦使用 ?來替換Z和X
case、casex、casez語句中,如果命中多個case條件,則執(zhí)行命中的第一個case
2、案例解析
always@(*) begin case(sel[1:0]) 2'b00: data1 = 3'd0 ; 2'b01: data1 = 3'd1 ; 2'b10: data1 = 3'd2 ; 2'b11: data1 = 3'd3 ; 2'b1z: data1 = 3'd4 ; 2'b1x: data1 = 3'd5 ; default: data1 = 3'd7 ; endcase end always@(*) begin casez(sel[1:0]) 2'b00: data2 = 3'd0 ; 2'b01: data2 = 3'd1 ; 2'b10: data2 = 3'd2 ; 2'b11: data2 = 3'd3 ; 2'b1z: data2 = 3'd4 ; 2'b1x: data2 = 3'd5 ; default: data2 = 3'd7 ; endcase end always@(*) begin casex(sel[1:0]) 2'b00: data3 = 3'd0 ; 2'b01: data3 = 3'd1 ; 2'b10: data3 = 3'd2 ; 2'b11: data3 = 3'd3 ; 2'b1z: data3 = 3'd4 ; 2'b1x: data3 = 3'd5 ; default: data3 = 3'd7 ; endcase end always@(*) begin casez(sel[1:0]) 2'b00: data4 = 3'd0 ; 2'b01: data4 = 3'd1 ; 2'b10: data4 = 3'd2 ; 2'b11: data4 = 3'd3 ; 2'b1?: data4 = 3'd4 ; 2'b1x: data4 = 3'd5 ; default: data4 = 3'd7 ; endcase end always@(*) begin casex(sel[1:0]) 2'b00: data5 = 3'd0 ; 2'b01: data5 = 3'd1 ; 2'b10: data5 = 3'd2 ; 2'b11: data5 = 3'd3 ; 2'b1?: data5 = 3'd4 ; 2'b1x: data5 = 3'd5 ; default: data5 = 3'd7 ; endcase endcase語句中4種狀態(tài)都會比較匹配
sel[1:0]為1’b1z時,命中了[2'b1z: data2 = 3'd4 ;],data1被賦值3’d4
sel[1:0]為1’b1x時,命中了[2'b1x: data2 = 3'd5 ;],data1被賦值3’d5
casez語句中Z狀態(tài)會被忽略,不做比較,X依舊進(jìn)行比較
sel[1:0]為1’b1z時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;]和[2'b1z: data2 = 3'd4; ],根據(jù)優(yōu)先級原則, data2被賦值3’d2
sel[1:0]為1’b1x時,依舊比較sel[1:0],命中了[2'b1x: data2 = 3'd5 ;], data2被賦值3’d5
casex語句中Z和X狀態(tài)會被忽略,不做比較
sel[1:0]為1’b1z時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;], data3被賦值3’d2
sel[1:0]為1’b1x時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;], data3被賦值3’d2
casez語句中采用?替換Z狀態(tài)
sel[1:0]為1’b1z時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;], data4被賦值3’d2
sel[1:0]為1’b1x時,同時命中了[2'b1?: data4 = 3'd4 ;]和[2'b1x: data4 = 3'd5 ;],根據(jù)優(yōu)先級原則,data4被賦值3’d4
casex語句中采用?替換Z狀態(tài)
sel[1:0]為1’b1z時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;]、[2'b1?: data5 = 3'd4 ;]、[2'b1x: data5 = 3'd5 ;],根據(jù)優(yōu)先級原則,data5被賦值3’d2
sel[1:0]為1’b1x時,實際僅比較sel[1],命中了[2'b10: data2 = 3'd2 ;]、[2'b1?: data5 = 3'd4 ;]、[2'b1x: data5 = 3'd5 ;],根據(jù)優(yōu)先級原則,data5被賦值3’d2
3、Do-not-care values 參考說明
SystemVerilog(IEEE Std 1800-2017)和verilog(IEEE P1364-2005)標(biāo)準(zhǔn)關(guān)于casez、casex的描述是一致的:截圖如下:
審核編輯:湯梓紅
-
仿真
+關(guān)注
關(guān)注
50文章
4129瀏覽量
134065 -
Verilog
+關(guān)注
關(guān)注
28文章
1352瀏覽量
110449 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59979 -
語法
+關(guān)注
關(guān)注
0文章
44瀏覽量
9870 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10872
原文標(biāo)題:verilog語法-淺談case casez casex
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
零基礎(chǔ)學(xué)FPGA(四)Verilog語法基基礎(chǔ)基礎(chǔ)(中)
新人求教關(guān)于case的語法問題:case里2個端口是什么意思?
在SpinalHDL中關(guān)于casez的使用
verilog中if與case語句不完整產(chǎn)生鎖存器的原因分析
關(guān)于verilog的學(xué)習(xí)經(jīng)驗簡單分享
![關(guān)于<b class='flag-5'>verilog</b>的學(xué)習(xí)經(jīng)驗簡單分享](https://file.elecfans.com/web1/M00/4E/37/o4YBAFq4jsSAaNL7AAjlLLMYD9s924.png)
FPGA代碼經(jīng)驗 case,casez,casex語句
一文淺析case、casex、casez區(qū)別
Verilog語法之generate for、generate if、generate case
Verilog中的If語句和case語句介紹
![<b class='flag-5'>Verilog</b>中的If語句和<b class='flag-5'>case</b>語句介紹](https://file1.elecfans.com//web2/M00/82/AD/wKgZomRcm0CAI-dnAAAcBH8-WSM819.jpg)
CASE:創(chuàng)建多路分支
![<b class='flag-5'>CASE</b>:創(chuàng)建多路分支](https://file1.elecfans.com/web2/M00/8B/80/wKgaomSaW5uAQthVAAAOXO7mUh0029.png)
評論