chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

RTL表達(dá)式和運(yùn)算符

OpenFPGA ? 來源:OpenFPGA ? 作者:OpenFPGA ? 2022-10-21 09:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

c29ed34c-50da-11ed-a3b6-dac502259ad0.png

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

介紹

if-else語句對表達(dá)式求值并執(zhí)行兩個可能的分支之一,即true分支或false分支。

c2ccbd84-50da-11ed-a3b6-dac502259ad0.png

if-else表達(dá)式可以是任何向量大小的網(wǎng)絡(luò)或變量,也可以是運(yùn)算的返回值,如果表達(dá)式的一個或多個位設(shè)置為l,則向量表達(dá)式的計算結(jié)果為true。如果表達(dá)式的所有位均為0,則表達(dá)式的計算結(jié)果為false。例如:

c2e2ea5a-50da-11ed-a3b6-dac502259ad0.png

a和b的按位AND運(yùn)算的結(jié)果是8位向量(因為a和b都是8位向量)。如果AND操作導(dǎo)致任何位置1,那么將執(zhí)行true分支。如果邏輯AND的結(jié)果為零,則將執(zhí)行false分支,

最佳實踐指南6-1
對于if-else條件表達(dá)式,盡量只使用1位值或返回true/false操作。不要將向量用作if-else表達(dá)式。

之前的文章也詳細(xì)介紹了返回true/false結(jié)果的運(yùn)算符。

不要對向量進(jìn)行true/false測試。評估向量為true/false可能會導(dǎo)致設(shè)計錯誤。在前面的示例中,編寫代碼的工程師打算測試(a & b)的true/false,但是它是8位向量值,它并不是true/false邏輯運(yùn)算的1位結(jié)果。對于a和b的某些值,if-else決策執(zhí)行的哪個分支可能不同,通過遵循僅使用標(biāo)量(1位)值或返回具有true/false結(jié)果的操作的指南,可以避免這種模糊性和可能的編碼錯誤。

對于4狀態(tài)值,表達(dá)式可能既不是真的也不是假的,如值8’b0000000z。一個既不正確也不錯誤的表達(dá)被認(rèn)為是未知的。當(dāng)if-else決策的表達(dá)式計算為未知時,將執(zhí)行false分支。這可能會導(dǎo)致RTL模型的仿真方式以及綜合后門級模型的實際行為不匹配。后面我們會討論關(guān)于SystemVerilog模型中的X-optimism 和 X-pessimism對這種情況進(jìn)行了討論。

if-else決策的每個分支可以是一條語句,也可以是一組包含在begin和end之間的語句,如下面的代碼段所示,

c2ee8b9e-50da-11ed-a3b6-dac502259ad0.png

沒有else分支的if語句。if-else決策的else(false)分支是可選的。如果沒有else分支,且表達(dá)式的計算結(jié)果為false(或unknown),則不執(zhí)行任何語句。在下面的代碼段中,如果enable為0,則out不會更改。由于out是一個變量,它保留了以前的值,仿真時會產(chǎn)生鎖存器行為。

c30b2d9e-50da-11ed-a3b6-dac502259ad0.png

If-else-if。多個判斷語句可以由一系列if-else語句組成,如下面的代碼片段所示。

c3203982-50da-11ed-a3b6-dac502259ad0.png

請注意,SystemVerilog不像某些編程語言那樣具有elsif關(guān)鍵字。決策鏈由包含嵌套if-else語句的每個else分支組成。當(dāng)上面的代碼段使用不同的縮進(jìn)編碼時,這種嵌套更為明顯,如下所示。

c32daa54-50da-11ed-a3b6-dac502259ad0.png

一系列if-else-if決策按照語句的列出時序進(jìn)行評估。這將優(yōu)先考慮首先列出的判斷條件。下面的示例演示了一個可以set和reset的觸發(fā)器。如果set和reset同時激活,reset具有優(yōu)先級,因為它是在一系列決策中首先進(jìn)行判斷的。本例中的set和reset為低電平有效信號。

c35c3112-50da-11ed-a3b6-dac502259ad0.png

(該set和reset觸發(fā)器示例存在潛在的仿真故障,后面我們再對此進(jìn)行討論。)

綜合if-else語句。綜合編譯器實現(xiàn)if-else語句的方式取決于決策語句的上下文以及目標(biāo)ASICFPGA中可用的組件類型。一般規(guī)則是:

組合邏輯中的if-else語句表現(xiàn)為多路復(fù)用器,通常在門級實現(xiàn)中實現(xiàn)為多路復(fù)用器。

如果沒有其他語句分配給同一個變量,則組合邏輯中沒有else的if將充當(dāng)鎖存器,這是因為分配的變量保留其先前的值。綜合器通常將這種存儲效果作為鎖存器來實現(xiàn),

組合邏輯中的if-else-if語句系列使用優(yōu)先級編碼行為進(jìn)行仿真,其中每個if語句優(yōu)先于該系列中的任何后續(xù)if語句。如果所有決策表達(dá)式都是互斥的(兩個或多個表達(dá)式不可能同時為真),則綜合編譯器將刪除優(yōu)先級編碼。

時鐘邊沿評估的if-else語句表現(xiàn)為觸發(fā)器,并將在門級實現(xiàn)中綜合為某種類型的寄存器。

使用if-else作為多路復(fù)用器。圖6-1中的示例6-1及其附帶的綜合結(jié)果顯示了,綜合器會在多路復(fù)用器的上下文中判斷是否使用了else。

示例6-1:使用if-else對多路復(fù)用器功能進(jìn)行建模

`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulemux2to1
#(parameterN=4)//bussize
(inputlogicsel,//1-bitinput
inputlogic[N-1:0]a,b,//scalableinputsize
outputlogic[N-1:0]y//scalableoutputsize
);
timeunit1ns;timeprecision1ns;

always_combbegin
if(sel)y=a;
elsey=b;
end

endmodule:mux2to1
`end_keywords
圖6-1:示例6-1的綜合結(jié)果:作為MUX的if-else c378be86-50da-11ed-a3b6-dac502259ad0.png

使用if-else作為鎖存器。示例6-2顯示了表示鎖存器的if語句。

示例6-2:使用if不適用else來仿真鎖存器功能

`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulelatch
#(parameterN=4)//bussize
(inputlogicena,//1-bitinput
inputlogic[N-1:0]in,//scalableinputsize
outputlogic[N-1:0]out//scalableoutputsize
);
timeunit1ns;timeprecision1ns;

always_latchbegin
if(ena)out<=?in;?
??end

endmodule:?latch
`end_keywords
圖6-2:示例6-2的綜合結(jié)果:if-else作為鎖存器 c3d2566c-50da-11ed-a3b6-dac502259ad0.png

用于生成圖6-2的綜合編譯器將RTL功能轉(zhuǎn)換為具有未使用的set和reset輸入的通用鎖存器。最終實現(xiàn)中使用的鎖存器的具體類型將取決于目標(biāo)ASIC或FPGA中可用的鎖存器類型。

使用if-else作為優(yōu)先級編碼器。示例6-3說明了4對2優(yōu)先級編碼器中的if-else-if。

示例6-3:使用if else if系列對優(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;
if(d_in[3])d_out=2'h3;//bit3isset
elseif(d_in[2])d_out=2'h2;//bit2isset
elseif(d_in[1])d_out=2'h1;//bit1isset
elseif(d_in[0])d_out=2'h0;//bit0isset
elsebegin//nobitsset
d_out=2'b0;
error='1;
end
end
endmodule:priority_4to2_encoder
`end_keywords

c3fc9166-50da-11ed-a3b6-dac502259ad0.png 圖6-3;示例6-3的綜合結(jié)果:if-else作為優(yōu)先編碼器

圖6-3中的“優(yōu)先級編碼”被綜合為一系列邏輯門,其中一級的輸出成為“序列中下一級”的輸入,而不是并行編碼d_in的所有位?!霸摯袛?shù)據(jù)路徑”是“if-else-if”系列中計算d_in數(shù)據(jù)位的優(yōu)先級的結(jié)果。

使用if-else作為觸發(fā)器。示例6-4顯示了帶有復(fù)位和芯片使能(也稱為負(fù)載使能或數(shù)據(jù)使能)輸入的時序邏輯觸發(fā)器中的if-else-if。因為復(fù)位輸入是首先評估的,所以它的優(yōu)先級高于使能輸入,圖6-4顯示了綜合這個if-else-if決策序列的結(jié)果。

例6-4;使用if-else-if系列為帶復(fù)位和芯片使能的觸發(fā)器建模

moduleenable_ff
#(parameterN=1)//bussize
(inputlogicclk,//posedgetriggeredclk
inputlogicrstN,//activelowasyncreset
inputlogicenable,//activehighchipenable
inputlogic[N-1:0]d,//scalableinputsize
outputlogic[N-1:0]q//scalableoutputsize
);
timeunit1ns;timeprecision1ns;

always_ff@(posedgeclkornegedgerstN)//asyncreset
if(!rstN)q<=?'0;??????????????//?active-low?reset
???else?if?(enable)?q?<=?d;???????????????//?store?if?enabled

endmodule:?enable_ff

c43629a8-50da-11ed-a3b6-dac502259ad0.png 圖6-4:示例6-4的綜合結(jié)果:if-else作為芯片啟用觸發(fā)器

圖6-4顯示了綜合如何將帶低電平復(fù)位和使能的芯片觸發(fā)器映射到通用組件。該過程的下一步是綜合編譯器將該通用組件映射到目標(biāo)ASIC或FPGA設(shè)備中可用的特定類型的觸發(fā)器,如果該目標(biāo)設(shè)備沒有芯片使能觸發(fā)器,則綜合將在觸發(fā)器之外添加多路復(fù)用器功能,以模擬芯片使能行為,如果觸發(fā)器使能,多路復(fù)用器將把新的數(shù)據(jù)值傳遞給D輸入,并將觸發(fā)器Q輸出反饋給D輸入。如果觸發(fā)器未使能,則輸入。以類似的方式,如果目標(biāo)設(shè)備沒有具有異步低電平有效的復(fù)位的觸發(fā)器,則綜合編譯器將在觸發(fā)器之外添加功能,以模擬這種行為,后面再討論具有各種復(fù)位類型的建模和綜合觸發(fā)器。

SystemVerilog-程序塊 (procedural blocks)

c47964b6-50da-11ed-a3b6-dac502259ad0.jpg

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

    關(guān)注

    11

    文章

    3483

    瀏覽量

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

    關(guān)注

    6

    文章

    969

    瀏覽量

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

    關(guān)注

    1

    文章

    389

    瀏覽量

    61087
  • 運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    11481

原文標(biāo)題:SystemVerilog-決策語句-if-else語句

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    數(shù)字硬件建模SystemVerilog-按位運(yùn)算符

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符
    的頭像 發(fā)表于 08-12 14:27 ?3078次閱讀

    關(guān)于數(shù)字硬件建模SystemVerilog

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符。
    的頭像 發(fā)表于 09-01 08:50 ?1689次閱讀

    C語言程序設(shè)計--運(yùn)算符表達(dá)式

    c語言對數(shù)據(jù)有很強(qiáng)的表達(dá)能力,具有十分豐富的運(yùn)算符,利用這些運(yùn)算符可以組成各種表達(dá)式及語句。運(yùn)算符就是完成某種特定
    發(fā)表于 07-14 21:30 ?46次下載

    單片機(jī)C語言教程-運(yùn)算符表達(dá)式

    單片機(jī)C語言教程-運(yùn)算符表達(dá)式   單片機(jī)C語言教程-運(yùn)算符表達(dá)式  運(yùn)算符的種類、優(yōu)先級和結(jié)合性  c語言中運(yùn)
    發(fā)表于 03-27 17:13 ?2321次閱讀

    基于運(yùn)算符信息的數(shù)學(xué)表達(dá)式檢索技術(shù)

    傳統(tǒng)的文本檢索技術(shù)主要面向一維文本,難以用于對二維結(jié)構(gòu)數(shù)學(xué)表達(dá)式的檢索。針對該問題,通過引入公式描述結(jié)構(gòu),實現(xiàn)基于運(yùn)算符信息的數(shù)學(xué)表達(dá)式檢索。利用公式描述結(jié)構(gòu)提取算法獲取 Latex數(shù)學(xué)表達(dá)式
    發(fā)表于 04-29 15:58 ?2次下載
    基于<b class='flag-5'>運(yùn)算符</b>信息的數(shù)學(xué)<b class='flag-5'>表達(dá)式</b>檢索技術(shù)

    RTL表達(dá)式運(yùn)算符

    運(yùn)算符對操作數(shù)執(zhí)行操作。大多數(shù)運(yùn)算符都有兩個操作數(shù)。
    的頭像 發(fā)表于 07-21 09:11 ?2264次閱讀

    RTL表達(dá)式運(yùn)算符

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符
    的頭像 發(fā)表于 07-27 09:11 ?2069次閱讀

    SystemVerilog-運(yùn)算符/表達(dá)式規(guī)則

    RTL建模中廣泛使用的運(yùn)算符是條件運(yùn)算符,也稱為三元運(yùn)算符,該運(yùn)算符用于在兩個表達(dá)式之間進(jìn)行選擇
    的頭像 發(fā)表于 08-03 09:03 ?3701次閱讀

    關(guān)于RTL表達(dá)式運(yùn)算符

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符
    的頭像 發(fā)表于 09-01 09:13 ?2267次閱讀

    RTL表達(dá)式運(yùn)算符

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符。
    的頭像 發(fā)表于 10-11 10:15 ?2235次閱讀

    RTL表達(dá)式運(yùn)算符

    經(jīng)過幾周的更新,SV核心部分用戶自定義類型和包內(nèi)容已更新完畢,接下來就是RTL表達(dá)式運(yùn)算符
    的頭像 發(fā)表于 11-03 09:14 ?1740次閱讀

    運(yùn)算符/表達(dá)式規(guī)則

    運(yùn)算符對操作數(shù)執(zhí)行操作。大多數(shù)運(yùn)算符都有兩個操作數(shù)。例如,在運(yùn)算a+b中,+(加法)運(yùn)算的操作數(shù)是a和b。每個操作數(shù)都被稱為表達(dá)式,
    的頭像 發(fā)表于 02-09 15:37 ?1401次閱讀
    <b class='flag-5'>運(yùn)算符</b>/<b class='flag-5'>表達(dá)式</b>規(guī)則

    邏輯運(yùn)算符表達(dá)式

    在C語言中,我們通常會進(jìn)行真值與假值的判斷,這時我們就需要用到邏輯運(yùn)算符與邏輯表達(dá)式。如果表達(dá)式的值不為0,則通通返回為真值。只有當(dāng)表達(dá)式的值為0時,才會返回假值。
    的頭像 發(fā)表于 02-21 15:16 ?2654次閱讀
    邏輯<b class='flag-5'>運(yùn)算符</b>與<b class='flag-5'>表達(dá)式</b>

    位邏輯運(yùn)算符表達(dá)式

    位邏輯運(yùn)算符與位邏輯表達(dá)式可以實現(xiàn)位的編輯,比如位的清零、設(shè)置、取反和取補(bǔ)等操作。使用位邏輯運(yùn)算符與位邏輯表達(dá)式可以在不使用匯編的情況下實現(xiàn)部分匯編的功能
    的頭像 發(fā)表于 02-21 15:22 ?1700次閱讀
    位邏輯<b class='flag-5'>運(yùn)算符</b>與<b class='flag-5'>表達(dá)式</b>

    C語言基本的算術(shù)運(yùn)算符表達(dá)式

    注意:自增和自減運(yùn)算符只能用于變量,而不能用于常量或表達(dá)式 **C語言算術(shù)表達(dá)式運(yùn)算符的優(yōu)先級與結(jié)合性 ** 在表達(dá)式求值時,
    的頭像 發(fā)表于 03-09 10:44 ?2078次閱讀