數(shù)字硬件建模SystemVerilog-決策語句-case語句
經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式和運(yùn)算符。
馬上HDLBits-SystemVerilog版本也開始準(zhǔn)備了,基本這一部分完成后就開始更新~
決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號的當(dāng)前值分支到特定語句。SystemVerilog有兩個(gè)主要的決策語句:if…else語句和case語句,使用關(guān)鍵字case、case…inside,casex和casez。
介紹
case語句提供了一種簡潔的方式來表示一系列決策選擇。例如:
SystemVerilog case語句與C switch語句類似,但有重要區(qū)別。SystemVerilog不能使用break語句(C使用break從switch語句的分支退出)。case語句在執(zhí)行分支后自動退出(使用break退出case語句是非法的。),不能執(zhí)行break語句。
SystemVerilog有4種不同的case語句,關(guān)鍵字為case、case…inside casex和casez。這些不同case語句的一般語法和用法是相同的。這些區(qū)別將在本文后面介紹。
case、casex或casez關(guān)鍵字后面跟一個(gè)用括號括起來的case表達(dá)式。case表達(dá)式可以是網(wǎng)絡(luò)、變量、用戶定義類型、參數(shù)常量、文字值或運(yùn)算結(jié)果。case表達(dá)式后面跟一個(gè)冒號,如果case表達(dá)式與case項(xiàng)匹配,后續(xù)執(zhí)行是可以是一條語句或者begin-end包含的系列語句。
默認(rèn)case項(xiàng)??梢允褂胐efault關(guān)鍵字指定可選的默認(rèn)case項(xiàng)。如果case表達(dá)式與任何case項(xiàng)不匹配,將執(zhí)行默認(rèn)case項(xiàng)。在上面的例子中,case項(xiàng)覆蓋了2位操作碼的所有可能的2-state值。但是,如果操作碼是4-state類型,則會有額外的X和Z值未被case項(xiàng)覆蓋。如果操作碼的任何位都是X或Z,則將執(zhí)行默認(rèn)case項(xiàng),在前面的示例中,該分支將把X值傳播到結(jié)果變量上。默認(rèn)情況下的case項(xiàng)不需要是最后一個(gè)case項(xiàng)。語法上,默認(rèn)case項(xiàng)可以是第一個(gè)case項(xiàng),或者在case項(xiàng)中的任何地方,代碼可讀性的最佳實(shí)踐編碼風(fēng)格是默認(rèn)case項(xiàng)為最后一個(gè)case項(xiàng)。
以逗號分隔的case項(xiàng)列表。case項(xiàng)可以是逗號分隔的列表,如以下代碼段所示:
如果操作碼的值為2’b00或2’b01,則執(zhí)行case語句的第一個(gè)分支,如果值為2’b10或2’b11,則執(zhí)行第二個(gè)分支。
case與case…inside
當(dāng)只使用case關(guān)鍵字時(shí), case表達(dá)式將與case項(xiàng)進(jìn)行比較,比較的運(yùn)算符為(===)。(===)運(yùn)算符將比較表達(dá)式的每一位,這將獲得4-state值的精確匹配。在下面的代碼段中,如果select的值為1’bz,則執(zhí)行第三個(gè)分支,如果select的值為1’bx,則執(zhí)行第四個(gè)分支(此示例不可綜合;綜合不允許比較X和Z值)
在case…inside語句中,使用(==?)通配符case相等運(yùn)算符的行為將case表達(dá)式與case項(xiàng)進(jìn)行比較(case使用===運(yùn)算符)。(==?)運(yùn)算符允許從比較中屏蔽某一位(即不進(jìn)行某一位的比較)。case項(xiàng)中的任何位被設(shè)置為x或z或?當(dāng)case表達(dá)式與case項(xiàng)進(jìn)行比較時(shí),該位位置將被忽略。
在以下示例中,如果selector的最高有效位置1,將執(zhí)行第一個(gè)分支,忽略case項(xiàng)的所有剩余位,如果selector的上兩位的值為01,將執(zhí)行第二個(gè)分支,并忽略剩余位,依此類推:
過時(shí)的casex和casez語句
在SystemVerilog于2005年擴(kuò)展Verilog語言之前,最初的Verilog語言使用casex和casez關(guān)鍵字來屏蔽比較中的位。SystemVerilog將casex和casez替換為case…inside關(guān)鍵字。casex和casez語句屏蔽了設(shè)置為x、z或?的任何位。Casez語句僅屏蔽設(shè)置為z或?的位
最佳實(shí)踐指南6-2 |
---|
用case…inside在決策語句中忽略case項(xiàng)中的特定位。不要使用過時(shí)的casex和casez語句。 |
SystemVerilog取代casex和casez的原因是,它們在仿真時(shí)存在嚴(yán)重缺陷,在綜合邏輯門后,其行為與RTL仿真非常不同。簡而言之,casex和casez不僅允許在case項(xiàng)中屏蔽位,還允許在case表達(dá)式中屏蔽位,這種雙重掩蔽可能會導(dǎo)致執(zhí)行一個(gè)非預(yù)期的分支,而這可能不是由綜合創(chuàng)建的門級電路實(shí)現(xiàn)時(shí)采用的同一個(gè)分支。casex和casez的缺點(diǎn)在本系列文章中沒有詳細(xì)討論,因?yàn)闆]有必要使用這些過時(shí)的語句。
case項(xiàng)優(yōu)先級和綜合優(yōu)化
case項(xiàng)按其列出的順序進(jìn)行評估。因此,第一個(gè)case項(xiàng)的優(yōu)先級高于所有后續(xù)case項(xiàng)。在評估case語句時(shí),仿真將始終遵循此優(yōu)先級。
這種推斷出的優(yōu)先級編碼在ASIC或FPGA實(shí)現(xiàn)中通常是不可取的。與并行計(jì)算相比,優(yōu)先級編碼邏輯需要更多的邏輯門和更長的傳播路徑。在將case語句轉(zhuǎn)換為邏輯門之前,綜合編譯器將分析case項(xiàng)的值。如果兩個(gè)case項(xiàng)不可能同時(shí)為真,則綜合編譯器將自動優(yōu)化門級實(shí)現(xiàn),以并行評估case項(xiàng),而不是作為優(yōu)先級編碼功能。
然而,如果兩個(gè)或多個(gè)case項(xiàng)可能同時(shí)為真,那么綜合將實(shí)現(xiàn)case語句仿真中固有的優(yōu)先級編碼邏輯。通過實(shí)施優(yōu)先級編碼,綜合時(shí)將確保ASIC或FPGA的門級行為與RTL仿真行為匹配。
例6-5顯示了一個(gè)4選1的多路復(fù)用器。在本例中,四個(gè)case表達(dá)式具有唯一的、不重疊的值。綜合器將識別到兩個(gè)case表達(dá)式不可能同時(shí)為真,并自動刪除case項(xiàng)的優(yōu)先級編碼。圖6-5顯示了綜合器如何實(shí)現(xiàn)case語句。
示例6-5:使用case語句對4選1多路復(fù)用器建模
//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords modulemux4to1 #(parameterN=8) ( inputlogic[N-1:0]a,b,c,d, inputlogic[1:0]select, outputlogic[N-1:0]y ); always_combbegin case(select) 2'b00:y=a; 2'b01:y=b; 2'b10:y=c; 2'b11:y=d; endcase end endmodule:mux4to1 //`end_keywords
![379301b8-5591-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A1/F0/wKgaomTt5r-AH3jkAAWOcJLsOU0660.png)
例6-5中的case項(xiàng)是互斥的,這意味著其中兩個(gè)case項(xiàng)不可能同時(shí)成立。因此,綜合編譯器刪除了case語句的優(yōu)先級編碼行為,并以多路復(fù)用器的形式對case項(xiàng)實(shí)現(xiàn)了更高效的并行計(jì)算,
綜合編譯器自動刪除優(yōu)先級邏輯,只要綜合可以確定所有case項(xiàng)都是互斥的(不會有兩個(gè)或多個(gè)case項(xiàng)同時(shí)計(jì)算結(jié)果為true)。如果綜合編譯器不能確定case項(xiàng)是互斥的,那么它將保留case項(xiàng)的優(yōu)先級方式。
示例6-6類似于示例6-3中所示的4選2優(yōu)先級編碼器,但這次使用case…inside,只允許檢查4位d_in值中的特定位。由于忽略了其他位,因此可能存在不止一個(gè)位case項(xiàng)同時(shí)為true,仿真將執(zhí)行第一個(gè)匹配分支,綜合編譯器將通過“保留case語句固有的優(yōu)先級編碼”來匹配該行為。
示例6-6:使用內(nèi)部的case項(xiàng)來仿真優(yōu)先級編碼器
//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords modulepriority_4to2_encoder( inputlogic[3:0]d_in, outputlogic[1:0]d_out, outputlogicerror ); timeunit1ns;timeprecision1ns; always_combbegin error='0; case(d_in)inside 4'b1???:d_out=2'h3;//bit3isset 4'b01??:d_out=2'h2;//bit2isset 4'b001?:d_out=2'h1;//bit1isset 4'b0001:d_out=2'h0;//bit0isset 4'b0000:begin//nobitsset d_out=2'b0; error='1; end endcase end endmodule:priority_4to2_encoder //`end_keywords
![37c3aea8-5591-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/A1/F0/wKgaomTt5sCADT4MAATwAqxjMMQ831.png)
優(yōu)先級邏輯的效果可以在一系列門電路中看到,d_in的不同位通過這些門傳播。當(dāng)使用一系列if-else-if語句時(shí),綜合編譯器綜合出來的電路非常相似,如上一章節(jié)的例程。
唯一和優(yōu)先決策修飾符
SystemVerilog為case和if-else決策語句提供三個(gè)修飾符:unique、unique0和priority。后面章節(jié)將詳細(xì)討論RTL模型中使用的修飾符。
簡而言之,unique、unigue0和priority修飾符有兩個(gè)功能:
它們影響綜合編譯器在門級電路實(shí)現(xiàn)case語句的方式。
他們在仿真中將會報(bào)告警告消息,幫助驗(yàn)證綜合效果是否會按預(yù)期工作。
這些決策修飾符的一個(gè)示例用法是:
對于綜合,本例中的unique修飾符通知綜合編譯器case語句可以被認(rèn)為是完整的,即使2位狀態(tài)變量的四個(gè)可能值中只有三個(gè)被解碼。同時(shí)還通知綜合編譯器,對case項(xiàng)并行評估是可以的。
對于仿真,unique關(guān)鍵字在仿真中啟用兩個(gè)檢查例程,如果對case語句進(jìn)行了評估,并且state的值與任何case項(xiàng)都不匹配,則將生成違規(guī)報(bào)告。此檢查有助于驗(yàn)證將case語句視為完整的綜合是否安全。如果state的值同時(shí)與多個(gè)案例項(xiàng)匹配,則還會生成違規(guī)報(bào)告。該檢查有助于驗(yàn)證對case項(xiàng)并行評估是安全的,而不是按照case項(xiàng)列出的順序,
-
硬件
+關(guān)注
關(guān)注
11文章
3399瀏覽量
66482 -
HDL
+關(guān)注
關(guān)注
8文章
328瀏覽量
47477 -
編碼
+關(guān)注
關(guān)注
6文章
958瀏覽量
54965 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59966
原文標(biāo)題:SystemVerilog-決策語句-case語句
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
Verilog中的always塊內(nèi)的語句執(zhí)行的速度?
mfc程序執(zhí)行流程小結(jié),MFC程序的執(zhí)行順序
![mfc<b class='flag-5'>程序</b><b class='flag-5'>執(zhí)行</b><b class='flag-5'>流程</b>小結(jié),MFC<b class='flag-5'>程序</b>的<b class='flag-5'>執(zhí)行</b>順序](https://file1.elecfans.com//web2/M00/A7/0D/wKgZomUMQhKAenDuAAAQv5sVIFQ461.jpg)
select語句和update語句分別是怎么執(zhí)行的
![select<b class='flag-5'>語句</b>和update<b class='flag-5'>語句</b>分別是怎么<b class='flag-5'>執(zhí)行</b>的](https://file.elecfans.com/web1/M00/CE/3C/pIYBAF-gtCCAEvkYAABQGfli8DA946.png)
Verilog的兩種塊語句解析
Verilog的塊語句
Verilog的塊語句fork...join 和 begin...end
SystemVerilog中的always語句塊
SCL用GOTO語句執(zhí)行程序跳轉(zhuǎn)
WHILE語句如何執(zhí)行
![WHILE<b class='flag-5'>語句</b>如何<b class='flag-5'>執(zhí)行</b>](https://file1.elecfans.com/web2/M00/A2/5C/wKgZomT9IICAND2iAAAkZnoVTsA613.png)
評論