1、語法說明
在rtl仿真中,有四種狀態(tài),分別是0、1、x(unknown values)和z(high-impedance values)。
case 結構體中:0,1,X與Z是四種不同的狀態(tài),case條件比較時會檢測比較雙方每個bit是否完全相等。
casez 結構體中:把Z當做don’t care conditions,case條件比較時,比較雙方存在Z值的bit位不參與比較 ,其他比特位相等則視為條件命中
casex 結構體中:把Z和X當做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依舊進行比較
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)標準關于casez、casex的描述是一致的:截圖如下:
審核編輯:湯梓紅
-
仿真
+關注
關注
50文章
4087瀏覽量
133648 -
Verilog
+關注
關注
28文章
1351瀏覽量
110124 -
RTL
+關注
關注
1文章
385瀏覽量
59820 -
語法
+關注
關注
0文章
44瀏覽量
9827 -
結構體
+關注
關注
1文章
130瀏覽量
10848
原文標題:verilog語法-淺談case casez casex
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論