數(shù)字硬件建模SystemVerilog-決策語句-case語句
經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達式和運算符。
馬上HDLBits-SystemVerilog版本也開始準備了,基本這一部分完成后就開始更新~
決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計中信號的當前值分支到特定語句。SystemVerilog有兩個主要的決策語句: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)鍵字后面跟一個用括號括起來的case表達式。case表達式可以是網(wǎng)絡(luò)、變量、用戶定義類型、參數(shù)常量、文字值或運算結(jié)果。case表達式后面跟一個冒號,如果case表達式與case項匹配,后續(xù)執(zhí)行是可以是一條語句或者begin-end包含的系列語句。
默認case項??梢允褂胐efault關(guān)鍵字指定可選的默認case項。如果case表達式與任何case項不匹配,將執(zhí)行默認case項。在上面的例子中,case項覆蓋了2位操作碼的所有可能的2-state值。但是,如果操作碼是4-state類型,則會有額外的X和Z值未被case項覆蓋。如果操作碼的任何位都是X或Z,則將執(zhí)行默認case項,在前面的示例中,該分支將把X值傳播到結(jié)果變量上。默認情況下的case項不需要是最后一個case項。語法上,默認case項可以是第一個case項,或者在case項中的任何地方,代碼可讀性的最佳實踐編碼風格是默認case項為最后一個case項。
以逗號分隔的case項列表。case項可以是逗號分隔的列表,如以下代碼段所示:
如果操作碼的值為2’b00或2’b01,則執(zhí)行case語句的第一個分支,如果值為2’b10或2’b11,則執(zhí)行第二個分支。
case與case…inside
當只使用case關(guān)鍵字時, case表達式將與case項進行比較,比較的運算符為(===)。(===)運算符將比較表達式的每一位,這將獲得4-state值的精確匹配。在下面的代碼段中,如果select的值為1’bz,則執(zhí)行第三個分支,如果select的值為1’bx,則執(zhí)行第四個分支(此示例不可綜合;綜合不允許比較X和Z值)
在case…inside語句中,使用(==?)通配符case相等運算符的行為將case表達式與case項進行比較(case使用===運算符)。(==?)運算符允許從比較中屏蔽某一位(即不進行某一位的比較)。case項中的任何位被設(shè)置為x或z或?當case表達式與case項進行比較時,該位位置將被忽略。
在以下示例中,如果selector的最高有效位置1,將執(zhí)行第一個分支,忽略case項的所有剩余位,如果selector的上兩位的值為01,將執(zhí)行第二個分支,并忽略剩余位,依此類推:
過時的casex和casez語句
在SystemVerilog于2005年擴展Verilog語言之前,最初的Verilog語言使用casex和casez關(guān)鍵字來屏蔽比較中的位。SystemVerilog將casex和casez替換為case…inside關(guān)鍵字。casex和casez語句屏蔽了設(shè)置為x、z或?的任何位。Casez語句僅屏蔽設(shè)置為z或?的位
最佳實踐指南6-2 |
---|
用case…inside在決策語句中忽略case項中的特定位。不要使用過時的casex和casez語句。 |
SystemVerilog取代casex和casez的原因是,它們在仿真時存在嚴重缺陷,在綜合邏輯門后,其行為與RTL仿真非常不同。簡而言之,casex和casez不僅允許在case項中屏蔽位,還允許在case表達式中屏蔽位,這種雙重掩蔽可能會導(dǎo)致執(zhí)行一個非預(yù)期的分支,而這可能不是由綜合創(chuàng)建的門級電路實現(xiàn)時采用的同一個分支。casex和casez的缺點在本系列文章中沒有詳細討論,因為沒有必要使用這些過時的語句。
case項優(yōu)先級和綜合優(yōu)化
case項按其列出的順序進行評估。因此,第一個case項的優(yōu)先級高于所有后續(xù)case項。在評估case語句時,仿真將始終遵循此優(yōu)先級。
這種推斷出的優(yōu)先級編碼在ASIC或FPGA實現(xiàn)中通常是不可取的。與并行計算相比,優(yōu)先級編碼邏輯需要更多的邏輯門和更長的傳播路徑。在將case語句轉(zhuǎn)換為邏輯門之前,綜合編譯器將分析case項的值。如果兩個case項不可能同時為真,則綜合編譯器將自動優(yōu)化門級實現(xiàn),以并行評估case項,而不是作為優(yōu)先級編碼功能。
然而,如果兩個或多個case項可能同時為真,那么綜合將實現(xiàn)case語句仿真中固有的優(yōu)先級編碼邏輯。通過實施優(yōu)先級編碼,綜合時將確保ASIC或FPGA的門級行為與RTL仿真行為匹配。
例6-5顯示了一個4選1的多路復(fù)用器。在本例中,四個case表達式具有唯一的、不重疊的值。綜合器將識別到兩個case表達式不可能同時為真,并自動刪除case項的優(yōu)先級編碼。圖6-5顯示了綜合器如何實現(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圖6-5:示例6-5的綜合結(jié)果:綜合4選1多路復(fù)用器的case語句
例6-5中的case項是互斥的,這意味著其中兩個case項不可能同時成立。因此,綜合編譯器刪除了case語句的優(yōu)先級編碼行為,并以多路復(fù)用器的形式對case項實現(xiàn)了更高效的并行計算,
綜合編譯器自動刪除優(yōu)先級邏輯,只要綜合可以確定所有case項都是互斥的(不會有兩個或多個case項同時計算結(jié)果為true)。如果綜合編譯器不能確定case項是互斥的,那么它將保留case項的優(yōu)先級方式。
示例6-6類似于示例6-3中所示的4選2優(yōu)先級編碼器,但這次使用case…inside,只允許檢查4位d_in值中的特定位。由于忽略了其他位,因此可能存在不止一個位case項同時為true,仿真將執(zhí)行第一個匹配分支,綜合編譯器將通過“保留case語句固有的優(yōu)先級編碼”來匹配該行為。
示例6-6:使用內(nèi)部的case項來仿真優(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圖6-6:示例6-6的綜合結(jié)果:case…inside作為優(yōu)先編碼器
優(yōu)先級邏輯的效果可以在一系列門電路中看到,d_in的不同位通過這些門傳播。當使用一系列if-else-if語句時,綜合編譯器綜合出來的電路非常相似,如上一章節(jié)的例程。
唯一和優(yōu)先決策修飾符
SystemVerilog為case和if-else決策語句提供三個修飾符:unique、unique0和priority。后面章節(jié)將詳細討論RTL模型中使用的修飾符。
簡而言之,unique、unigue0和priority修飾符有兩個功能:
它們影響綜合編譯器在門級電路實現(xiàn)case語句的方式。
他們在仿真中將會報告警告消息,幫助驗證綜合效果是否會按預(yù)期工作。
這些決策修飾符的一個示例用法是:
對于綜合,本例中的unique修飾符通知綜合編譯器case語句可以被認為是完整的,即使2位狀態(tài)變量的四個可能值中只有三個被解碼。同時還通知綜合編譯器,對case項并行評估是可以的。
對于仿真,unique關(guān)鍵字在仿真中啟用兩個檢查例程,如果對case語句進行了評估,并且state的值與任何case項都不匹配,則將生成違規(guī)報告。此檢查有助于驗證將case語句視為完整的綜合是否安全。如果state的值同時與多個案例項匹配,則還會生成違規(guī)報告。該檢查有助于驗證對case項并行評估是安全的,而不是按照case項列出的順序,
-
硬件
+關(guān)注
關(guān)注
11文章
3355瀏覽量
66342 -
HDL
+關(guān)注
關(guān)注
8文章
327瀏覽量
47416 -
編碼
+關(guān)注
關(guān)注
6文章
952瀏覽量
54885 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59875
原文標題:SystemVerilog-決策語句-case語句
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論