曰本美女∴一区二区特级A级黄色大片, 国产亚洲精品美女久久久久久2025, 页岩实心砖-高密市宏伟建材有限公司, 午夜小视频在线观看欧美日韩手机在线,国产人妻奶水一区二区,国产玉足,妺妺窝人体色WWW网站孕妇,色综合天天综合网中文伊,成人在线麻豆网观看

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

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

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

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

汽車電子技術(shù) ? 來源:OpenFPGA ? 作者:碎碎思 ? 2023-02-09 14:15 ? 次閱讀

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

圖片

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

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

圖片

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

介紹

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

圖片

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

圖片

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

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

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

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

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

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

圖片

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

圖片

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

圖片

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

圖片

一系列if-else-if決策按照語句的列出時(shí)序進(jìn)行評(píng)估。這將優(yōu)先考慮首先列出的判斷條件。下面的示例演示了一個(gè)可以set和reset的觸發(fā)器。如果set和reset同時(shí)激活,reset具有優(yōu)先級(jí),因?yàn)樗窃谝幌盗袥Q策中首先進(jìn)行判斷的。本例中的set和reset為低電平有效信號(hào)。

圖片

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

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

  • 組合邏輯中的if-else語句表現(xiàn)為多路復(fù)用器,通常在門級(jí)實(shí)現(xiàn)中實(shí)現(xiàn)為多路復(fù)用器。
  • 如果沒有其他語句分配給同一個(gè)變量,則組合邏輯中沒有else的if將充當(dāng)鎖存器,這是因?yàn)榉峙涞淖兞勘A羝湎惹暗闹?。綜合器通常將這種存儲(chǔ)效果作為鎖存器來實(shí)現(xiàn),
  • 組合邏輯中的if-else-if語句系列使用優(yōu)先級(jí)編碼行為進(jìn)行仿真,其中每個(gè)if語句優(yōu)先于該系列中的任何后續(xù)if語句。如果所有決策表達(dá)式都是互斥的(兩個(gè)或多個(gè)表達(dá)式不可能同時(shí)為真),則綜合編譯器將刪除優(yōu)先級(jí)編碼。
  • 時(shí)鐘邊沿評(píng)估的if-else語句表現(xiàn)為觸發(fā)器,并將在門級(jí)實(shí)現(xiàn)中綜合為某種類型的寄存器。

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

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

`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module mux2to1
#(parameter N = 4)            // bus size
(input  logic         sel,    // 1-bit input
 input  logic [N-1:0] a, b,   // scalable input size
 output logic [N-1:0] y       // scalable output size
);
  timeunit 1ns; timeprecision 1ns;

  always_comb begin
    if (sel) y = a; 
    else     y = b;
  end

endmodule: mux2to1
`end_keywords

圖6-1:示例6-1的綜合結(jié)果:作為MUX的if-else圖片

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

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

`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module latch
#(parameter N = 4)          // bus size
(input  logic         ena,  // 1-bit input
 input  logic [N-1:0] in,   // scalable input size
 output logic [N-1:0] out   // scalable output size
);
  timeunit 1ns; timeprecision 1ns;

  always_latch begin
    if (ena) out <= in; 
  end

endmodule: latch
`end_keywords

圖6-2:示例6-2的綜合結(jié)果:if-else作為鎖存器圖片

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

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

示例6-3:使用if else if系列對(duì)優(yōu)先級(jí)編碼器建模

`begin_keywords "1800-2012" // use SystemVerilog-2012 keywords
module priority_4to2_encoder (
 input  logic [3:0] d_in,
 output logic [1:0] d_out,
 output logic       error
);
 timeunit 1ns; timeprecision 1ns;

 always_comb begin 
   error = '0;
   if      (d_in[3]) d_out = 2'h3;  // bit 3 is set
   else if (d_in[2]) d_out = 2'h2;  // bit 2 is set
   else if (d_in[1]) d_out = 2'h1;  // bit 1 is set
   else if (d_in[0]) d_out = 2'h0;  // bit 0 is set
   else begin                       // no bits set
     d_out = 2'b0;
     error = '1;
   end
 end 
endmodule: priority_4to2_encoder
`end_keywords

圖片

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

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

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

module enable_ff
#(parameter N = 1)            // bus size
(input  logic         clk,    // posedge triggered clk
input  logic         rstN,   // active low async reset
input  logic         enable, // active high chip enable
input  logic [N-1:0] d,      // scalable input size
output logic [N-1:0] q       // scalable output size
);
 timeunit 1ns; timeprecision 1ns;

 always_ff @(posedge clk or negedge rstN) // async reset
   if      (!rstN)  q <= '0;              // active-low reset
   else if (enable) q <= d;               // store if enabled

endmodule: enable_ff

圖片

圖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ā)器。

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

    關(guān)注

    11

    文章

    2836

    瀏覽量

    77785
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3817

    瀏覽量

    82233
  • Case
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    13531
收藏 人收藏

    評(píng)論

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

    詳解C語言中if-else和switch-case語句

    一個(gè)基本的if語句由一個(gè)關(guān)鍵字if開頭,跟上在括號(hào)()里邊的是表示邏輯條件的表達(dá)式,然后是一對(duì)大括號(hào){}中間是若干條語句,如果條件的邏輯表達(dá)式的結(jié)果不是零,那么就執(zhí)行大括號(hào)中間的語句,否則就跳過不執(zhí)行。
    發(fā)表于 10-17 10:40 ?3732次閱讀

    C語言中if語句、if-else語句和switch語句詳解

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句。
    發(fā)表于 08-18 16:36 ?1.3w次閱讀
    C語言中if<b class='flag-5'>語句</b>、<b class='flag-5'>if-else</b><b class='flag-5'>語句</b>和switch<b class='flag-5'>語句</b>詳解

    Proteus之if-else語句的應(yīng)用

    Proteus之if-else語句的應(yīng)用,很好的Proteus資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-18 14:49 ?0次下載

    FPGA學(xué)習(xí)系列:if-else與case

    設(shè)計(jì)背景:不管是在什么軟件和硬件語言,我們?cè)谖覀兊拇a中都或多或少的用到這兩條語句,if..else與case語句,今天我們將學(xué)習(xí)verilog中的這兩條語句,其實(shí)不管在什么語言中這兩
    的頭像 發(fā)表于 06-01 16:59 ?1.2w次閱讀
    FPGA學(xué)習(xí)系列:<b class='flag-5'>if-else</b>與case

    C語言的switch case多分支選擇語句的詳細(xì)資料說明

    1、switch-case開關(guān)語句是一種多分支選擇語句,用來實(shí)現(xiàn)多方向條件分支。雖然采用if-else條件判斷語句也可以實(shí)現(xiàn)多方向條件分支,但是當(dāng)分支較多時(shí),使用
    發(fā)表于 07-12 17:39 ?1次下載
    C語言的switch case多分支選擇<b class='flag-5'>語句</b>的詳細(xì)資料說明

    FPGA代碼經(jīng)驗(yàn) case,casez,casex語句

    使用case語句代替嵌套的if-else將會(huì)產(chǎn)生更易讀的代碼,更好的邏輯利用率和更高的性能。
    的頭像 發(fā)表于 12-11 10:42 ?6548次閱讀

    不會(huì)有人不知道怎么優(yōu)雅的替換if-else語句

    來自:love1024.blog.csdn.net/article/details/104955363 場(chǎng)景日常開發(fā),if-else語句寫的不少吧??當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層
    的頭像 發(fā)表于 07-28 15:46 ?1587次閱讀
    不會(huì)有人不知道怎么優(yōu)雅的替換<b class='flag-5'>if-else</b><b class='flag-5'>語句</b>吧

    關(guān)于Python中的“for-else”功能

    無論使用哪種編程語言,我們都會(huì)編寫“if-else語句,但是“for-else”呢?
    發(fā)表于 09-26 14:44 ?644次閱讀

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

    決策語句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語句。
    的頭像 發(fā)表于 10-21 08:58 ?3668次閱讀

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

    SystemVerilog case語句與C switch語句類似,但有重要區(qū)別。SystemVerilog不能使用break語句(C使用b
    的頭像 發(fā)表于 10-27 08:57 ?1095次閱讀

    continue和break跳轉(zhuǎn)語句介紹

    跳轉(zhuǎn)語句允許程序代碼跳過一個(gè)或多個(gè)編程語句,SystemVerilog的jump語句是continue、break和disable。
    的頭像 發(fā)表于 11-09 09:23 ?2018次閱讀

    數(shù)字硬件建模SystemVerilog-組合邏輯建模(1)連續(xù)賦值語句

    SystemVerilog有三種在可綜合RTL級(jí)別表示組合邏輯的方法:連續(xù)賦值語句、always程序塊和函數(shù)。接下來幾篇文章將探討每種編碼風(fēng)格,并推薦最佳實(shí)踐編碼風(fēng)格。
    的頭像 發(fā)表于 12-07 15:31 ?1837次閱讀

    在Python中的if...else條件語句介紹

    在 Python 中,if...else 是一種條件語句,可以根據(jù)給定的條件執(zhí)行不同的操作。這個(gè)語句通常用于控制程序的流程。
    的頭像 發(fā)表于 04-19 15:43 ?1403次閱讀

    Python條件和條件語句

    print ( 'your age is' , age) 5 print ( 'adult' ) else語句 else子句只是增加一種選擇(之所以叫做子句是因?yàn)樗皇仟?dú)立的語句,而
    的頭像 發(fā)表于 09-12 16:45 ?757次閱讀

    Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

    每個(gè)if-else就是一個(gè)2選1mux器。當(dāng)信號(hào)有明顯優(yōu)先級(jí)時(shí),首先要考慮if-else,但是if嵌套過多也會(huì)導(dǎo)致速度變慢;if語句結(jié)構(gòu)較慢,但占用面積小。 嵌套的if語句如果使
    的頭像 發(fā)表于 11-29 15:10 ?4404次閱讀