0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

決策語句允許程序塊的執(zhí)行流程

OpenFPGA ? 來源:OpenFPGA ? 作者:OpenFPGA ? 2022-10-27 08:57 ? 次閱讀

數(shù)字硬件建模SystemVerilog-決策語句-case語句

經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達式和運算符。

馬上HDLBits-SystemVerilog版本也開始準備了,基本這一部分完成后就開始更新~

36d86312-5591-11ed-a3b6-dac502259ad0.png

決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計中信號的當前值分支到特定語句。SystemVerilog有兩個主要的決策語句:if…else語句和case語句,使用關(guān)鍵字case、case…inside,casex和casez。

介紹

case語句提供了一種簡潔的方式來表示一系列決策選擇。例如:

36f4db8c-5591-11ed-a3b6-dac502259ad0.png

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項可以是逗號分隔的列表,如以下代碼段所示:

370b0c2c-5591-11ed-a3b6-dac502259ad0.png

如果操作碼的值為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值)

37423d32-5591-11ed-a3b6-dac502259ad0.png

在case…inside語句中,使用(==?)通配符case相等運算符的行為將case表達式與case項進行比較(case使用===運算符)。(==?)運算符允許從比較中屏蔽某一位(即不進行某一位的比較)。case項中的任何位被設(shè)置為x或z或?當case表達式與case項進行比較時,該位位置將被忽略。

在以下示例中,如果selector的最高有效位置1,將執(zhí)行第一個分支,忽略case項的所有剩余位,如果selector的上兩位的值為01,將執(zhí)行第二個分支,并忽略剩余位,依此類推:

376460a6-5591-11ed-a3b6-dac502259ad0.png

過時的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)先級編碼在ASICFPGA實現(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
379301b8-5591-11ed-a3b6-dac502259ad0.png 圖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

37c3aea8-5591-11ed-a3b6-dac502259ad0.png 圖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ù)期工作。

這些決策修飾符的一個示例用法是:

37ef2cf4-5591-11ed-a3b6-dac502259ad0.png

對于綜合,本例中的unique修飾符通知綜合編譯器case語句可以被認為是完整的,即使2位狀態(tài)變量的四個可能值中只有三個被解碼。同時還通知綜合編譯器,對case項并行評估是可以的。

對于仿真,unique關(guān)鍵字在仿真中啟用兩個檢查例程,如果對case語句進行了評估,并且state的值與任何case項都不匹配,則將生成違規(guī)報告。此檢查有助于驗證將case語句視為完整的綜合是否安全。如果state的值同時與多個案例項匹配,則還會生成違規(guī)報告。該檢查有助于驗證對case項并行評估是安全的,而不是按照case項列出的順序,

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3355

    瀏覽量

    66342
  • HDL
    HDL
    +關(guān)注

    關(guān)注

    8

    文章

    327

    瀏覽量

    47416
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    952

    瀏覽量

    54885
  • RTL
    RTL
    +關(guān)注

    關(guān)注

    1

    文章

    385

    瀏覽量

    59875

原文標題:SystemVerilog-決策語句-case語句

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Verilog中的always內(nèi)的語句執(zhí)行的速度?

    Verilog中的always內(nèi)的語句執(zhí)行的速度是什么樣的,如果always是時鐘上升沿觸發(fā)的,會不會內(nèi)
    發(fā)表于 10-29 22:30

    mfc程序執(zhí)行流程小結(jié),MFC程序執(zhí)行順序

     摘要:本文章主要以MFC程序執(zhí)行流程、執(zhí)行順序等執(zhí)行過程的剖析做出的結(jié)論,下面一起來看看原文的具體介紹。
    發(fā)表于 12-08 15:48 ?9578次閱讀
    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>順序

    select語句和update語句分別是怎么執(zhí)行

    最近有粉絲面試互聯(lián)網(wǎng)公司被問到:你知道select語句和update語句分別是怎么執(zhí)行的嗎?,要我寫一篇這兩者執(zhí)行SQL語句的區(qū)別,這不就來
    的頭像 發(fā)表于 11-03 09:41 ?3587次閱讀
    select<b class='flag-5'>語句</b>和update<b class='flag-5'>語句</b>分別是怎么<b class='flag-5'>執(zhí)行</b>的

    Verilog的兩種語句解析

    1. 語句有兩種,一種是 begin-end 語句, 通常用來標志()執(zhí)行語句;一種是 fork-join
    的頭像 發(fā)表于 06-18 15:16 ?3082次閱讀

    Verilog的語句

    begin_end順序,用于將多條語句組成順序,語句按順序一條一條執(zhí)行(除了帶有內(nèi)嵌延遲控制的非阻塞賦值
    的頭像 發(fā)表于 05-18 10:29 ?1416次閱讀

    Verilog的語句fork...join 和 begin...end

    begin_end順序,用于將多條語句組成順序語句按順序一條一條執(zhí)行(除了帶有內(nèi)嵌延遲控制的非阻塞賦值
    的頭像 發(fā)表于 06-09 10:30 ?3265次閱讀

    systemverilog的決策語句if…else語句介紹

    決策語句(Decision statements)允許程序執(zhí)行
    的頭像 發(fā)表于 10-21 08:58 ?3285次閱讀

    RTL表達式和運算符

    決策語句(Decision statements)允許程序執(zhí)行
    的頭像 發(fā)表于 10-21 09:04 ?1378次閱讀

    SystemVerilog中的always語句

    “always”關(guān)鍵字意味著這個語句“總是”一直執(zhí)行。大多數(shù)時候“always”后面跟一個邊沿事件或者延遲。
    的頭像 發(fā)表于 12-06 09:47 ?2528次閱讀

    SCL用GOTO語句執(zhí)行程序跳轉(zhuǎn)

    用GOTO語句能夠執(zhí)行程序跳轉(zhuǎn)。此引起立即跳轉(zhuǎn)到指定標號,為此而到同中不同的語句。
    的頭像 發(fā)表于 02-01 09:22 ?2679次閱讀

    什么是SystemVerilog-決策語句-if-else語句

    決策語句(Decision statements)允許程序執(zhí)行
    的頭像 發(fā)表于 02-09 14:15 ?1211次閱讀
    什么是SystemVerilog-<b class='flag-5'>決策</b><b class='flag-5'>語句</b>-if-else<b class='flag-5'>語句</b>?

    什么是程序

    程序是編程語句的容器。程序的主要目的是控制何時應(yīng)執(zhí)行編程
    的頭像 發(fā)表于 02-09 16:04 ?2219次閱讀
    什么是<b class='flag-5'>程序</b><b class='flag-5'>塊</b>

    WHILE語句如何執(zhí)行

    令“FOR”、“WHILE”和“REPEAT-UNTIL”的運行:由于系統(tǒng)不顯示這些指令中的變量值,因此可避免對循環(huán)時間造成影響。 WHILE允許執(zhí)行條件控制的循環(huán)地執(zhí)行語句序列。
    的頭像 發(fā)表于 09-10 09:48 ?865次閱讀
    WHILE<b class='flag-5'>語句</b>如何<b class='flag-5'>執(zhí)行</b>

    Python中什么是語句

    條件判斷 語句 什么是語句呢? 語句是在條件為真(條件
    的頭像 發(fā)表于 09-12 16:41 ?1038次閱讀

    單片機if是什么語句

    單片機中的if語句是一種條件語句,用于根據(jù)不同的條件執(zhí)行不同的代碼。在程序執(zhí)行過程中,條件
    的頭像 發(fā)表于 01-05 14:04 ?1876次閱讀