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

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

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

組合邏輯決策優(yōu)先級介紹

OpenFPGA ? 來源:OpenFPGA ? 2022-12-29 11:07 ? 次閱讀

數(shù)字門級電路可分為兩大類:組合邏輯和時序邏輯。鎖存器是組合邏輯和時序邏輯的一個交叉點,在后面會作為單獨的主題處理。

組合邏輯描述了門級電路,其中邏輯塊的輸出直接反映到該塊的輸入值的組合,例如,雙輸入AND門的輸出是兩個輸入的邏輯與。如果輸入值發(fā)生變化,輸出值將反映這一變化,組合邏輯的RTL模型需要反映這種門級行為,這意味著邏輯塊的輸出必須始終反映該邏輯塊當前輸入值的組合。

SystemVerilog有三種在可綜合RTL級別表示組合邏輯的方法:連續(xù)賦值語句、always程序塊和函數(shù)。接下來幾篇文章將探討每種編碼風格,并推薦最佳實踐編碼風格。

組合邏輯決策優(yōu)先級

SystemVerilog對if-else-if決策序列和case語句的語義是:按順序計算一系列選擇-只執(zhí)行第一個匹配的分支。這種行為使得表示優(yōu)先級編碼邏輯成為可能,即其中一種選擇優(yōu)先于另一種選擇。下面的代碼片段演示了一個以if-else-if決策鏈建模的4-2優(yōu)先級編碼器,其中高階位優(yōu)先于低階位。

69a92308-871e-11ed-bfe3-dac502259ad0.png

同樣的優(yōu)先級編碼器也可以通過使用case語句來建模。(下例使用了一種稱為reverse case語句的編碼風格)。

69d13be0-871e-11ed-bfe3-dac502259ad0.png

if-else-if示例和case語句示例在功能上相同,并將綜合為等效的門級電路。

從case語句中刪除不必要的優(yōu)先編碼

上面的優(yōu)先級編碼器示例取決于if-else-if決策和case語句的優(yōu)先級評估流程。然而,大多數(shù)決策序列并不依賴于這種仿真語義,即按照決策選項的列出順序?qū)ζ溥M行評估。有限狀態(tài)機(FSM)的獨熱碼狀態(tài)解碼器說明了這一點,每一個單次值都是唯一的。因此,case選項是相互排斥的——沒有兩個case選項可以同時為真。對于互斥的case選項, case選項的順序無關(guān)緊要,case語句的優(yōu)先級性質(zhì)也無關(guān)緊要。

下面的示例顯示了一個簡單的獨熱碼狀態(tài)機解碼器,獨熱碼編碼在枚舉類型標簽的文本值中。

69da1c06-871e-11ed-bfe3-dac502259ad0.png

綜合編譯器優(yōu)化case語句優(yōu)先級。在將RTL case語句轉(zhuǎn)換為門級實現(xiàn)時,綜合編譯器將在需要時保留優(yōu)先級編碼的求值,例如前面顯示的BCD示例。然而,當case選項相互排斥時,綜合編譯器將自動刪除優(yōu)先級編碼,并創(chuàng)建并行邏輯來評估case選項。與優(yōu)先級編碼電路相比,并行電路速度更快,所需要的門數(shù)更少。

unique和unique0的決策修飾符

在一些罕見的情況下,不需要對case語句進行隱式優(yōu)先級編碼,但綜合編譯器無法靜態(tài)地確定case選項在所有條件下都是互斥的,當這種情況發(fā)生時,綜合編譯器將在門級實現(xiàn)中保留優(yōu)先級編碼邏輯,以備不時之需。這種情況通常發(fā)生在以下情況之一:

case選項表達式使用通配符位。 case-inside決策允許使用通配符位,因為這些位可以是任何值,所以case表達式可能匹配多個case項。

如果case選項表達式使用變量,則綜合是一個靜態(tài)編譯過程,因此無法確定變量的值是否永遠不會重疊。

例7-3是一個reverse case語句,其中case項是具有一個變量的獨熱碼。

示例7-3:具有優(yōu)先級編碼邏輯(部分代碼)的狀態(tài)解碼器

//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulecase_with_priority_decode
(inputlogic[2:0]current_state,
outputlogicget_ready,get_set,get_going
);

typedefenumlogic[2:0]{READY=3'b001,
SET=3'b010,
GO=3'b100}states_t;

always_combbegin
{get_ready,get_set,get_going}=3'b000;
case(1'b1)
current_state[0]:get_ready='1;
current_state[1]:get_set='1;
current_state[2]:get_going='1;
endcase
end

endmodule:case_with_priority_decode
//`end_keywords

設(shè)計者可能知道current_state使用獨熱碼,因此case項是互斥的。然而,綜合編譯器不能靜態(tài)地確定當前狀態(tài)變量的值在所有情況下都是互斥的。因此,綜合器將使用優(yōu)先級編碼邏輯實現(xiàn)這一獨熱碼解碼器。case語句不會被自動優(yōu)化為并行計算。圖7-3顯示了綜合這種reverse case的結(jié)果。

圖7-3:例7-3的綜合結(jié)果:具有優(yōu)先級的case語句

69f5438c-871e-11ed-bfe3-dac502259ad0.png

因為綜合編譯器無法識別current_state變量只會有一個單獨的值,因此,case項是互斥的。

unique的決策參數(shù)。

當綜合無法自動檢測到case項值是互斥的時,設(shè)計工程師需要通知綜合編譯器,case項之間確實是唯一的。這可以通過在case關(guān)鍵字之前添加一個unique的決策修飾符來實現(xiàn),如下例所示:

示例7-4:具有unique并行編碼邏輯的狀態(tài)解碼器

//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords
modulecase_with_unique0_decode
(inputlogic[2:0]current_state,
outputlogicget_ready,get_set,get_going
);

typedefenumlogic[2:0]{READY=3'b001,
SET=3'b010,
GO=3'b100}states_t;

always_combbegin
{get_ready,get_set,get_going}=3'b000;
unique0case(1'b1)
//uniquecase(1'b1)//work-aroundifunique0notsupported
current_state[0]:get_ready='1;
current_state[1]:get_set='1;
current_state[2]:get_going='1;
endcase
end

endmodule:case_with_unique0_decode
//`end_keywords

圖7-4顯示了綜合該示例的結(jié)果。

6a1e7c34-871e-11ed-bfe3-dac502259ad0.png

圖7-4:示例7-4的綜合結(jié)果:使用unique

使用unique會指示綜合編譯器可以并行計算case項。與圖7-3所示的優(yōu)先級實現(xiàn)相比,這顯著減少了該獨熱碼解碼器的門數(shù)和傳播路徑的數(shù)量。

對于綜合,unique修飾符表示每個case項表達式都將具有互斥的“唯一”值,因此門級實現(xiàn)可以并行計算case項,unique修飾符進一步通知綜合,在case狀態(tài)中未使用的任何案例表達式值,可以忽略不計。但在某些設(shè)計中,這可能會觸發(fā)綜合優(yōu)化,從而減少門數(shù)和傳播路徑。

對于仿真,unique支持運行時錯誤檢查。如果出現(xiàn)以下情況,將報告違規(guī)信息

絕不會有多個case 項表達式同時為true

出現(xiàn)的每個case表達式值都有一個分支。

最佳實踐指南7-9
只有在確定綜合邏輯優(yōu)化效果是理想的情況下,才能使用unique的決策修飾符。

大多數(shù)情況下,不需要也不應該在case語句中使用unique 決策修飾符——unique修飾符可能會導致綜合優(yōu)化,這在許多設(shè)計中可能并不可取。

示例7-3和7-4中所示的reverse case語句編碼風格是綜合編譯器需要決策修飾符以實現(xiàn)最佳結(jié)果質(zhì)量(QoR)的少數(shù)例外之一。

unique0決策修飾符

SystemVerilog-2009添加了一個unique0決策修飾符。與unique一樣,unique0決策修飾符通知綜合編譯器,每個case項表達式都有一個排斥的、唯一的值,在門級實現(xiàn)之前,可以并行計算case項,但與unique不同,unique0修飾符不會通知綜合忽略case語句中未使用的case表達式值。

對于仿真,unique0決策修飾符只支持運行時錯誤檢查,以確保不存在多個case項表達式同時為真。如果對case語句進行了計算,并且沒有匹配的case項,則不會出現(xiàn)運行時違規(guī)消息。

最佳實踐指南7-10
在RTL模型中使用unique的決策修飾符。不要使用unique0決策修飾符。unique0修飾符在 未來可能會被推薦使用,但在本文撰寫時,一些仿真器和大多數(shù)綜合編譯器不支持unique0。

過時的parallel_case 綜合注釋

(pragma就是為了讓編譯器編譯出的程序與機器硬件和操作系統(tǒng)保持完全兼容而定義的宏擴展)

SystemVerilog在最初的Verilog語言中添加了unique和unique0的決策修飾符。在傳統(tǒng)的Verilog中,設(shè)計工程師告訴綜合編譯器所有case項都可以被視為互斥的唯一方法是通過parallel_case的synthesis pragma語句。synthesis pragma是以synthesis一詞開頭的特殊注釋。仿真器會忽略注釋,但綜合編譯器會對這些專用的synthesis pragma進行操作。

case(

筆記
在寫本文的時候,一個商業(yè)綜合編譯器并不認為// synthesis是綜合注釋。該編譯器要求pragma以// pragma或// synopsys開頭。

警告-使用注釋向綜合編譯器提供指令存在危險。Parallel_case之類的注釋可以對case語句的門級實現(xiàn)產(chǎn)生重大影響。這些效果在仿真中無法驗證!對于仿真器來說,綜合注釋不過是一種注釋。RTL級別的設(shè)計驗證不是驗證與門級實現(xiàn)相同的功能。

unique和unigue0決策修飾符取代了parallel_case綜合注釋——這些決策修飾符是語言的活躍部分,而不是以注釋出現(xiàn)。

unique0 case在綜合中的效果與parallel_case相同,此外,unique0支持運行時仿真檢查,確保每次計算case語句時,case表達式最多只匹配一個case項(如果case表達式不匹配任何case項,則不是錯誤)。

unique case在綜合中的效果與兩個綜合注釋相同, parallel_case和full_case。unique修飾符允許運行時仿真檢查,即在每次計算case語句時,case表達式正好與一個case項相匹配。

最佳實踐指南7-11
不要使用過時的parallel_case綜合注釋!

綜合編譯器非常擅長自動檢測case語句何時可以作為并行解碼器實現(xiàn),而不影響設(shè)計功能,在極少數(shù)情況下,需要告知綜合編譯器使用并行實現(xiàn)時,請使用unique決策修飾符。unique決策修飾符通知綜合編譯器,case項可以像parallel_case綜合注釋一樣被視為互斥的,但決策修飾符添加了仿真運行時檢查,以幫助檢測RTL仿真期間case項并行解碼的潛在問題。

(unique0 決策修飾符更準確地描述了parallel_case綜合注釋,但本文不建議使用unique0,因為在編寫本文時,大多數(shù)綜合編譯器都不支持它。)






審核編輯:劉清

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

    關(guān)注

    45

    文章

    3645

    瀏覽量

    134579
  • 鎖存器
    +關(guān)注

    關(guān)注

    8

    文章

    906

    瀏覽量

    41523
  • Verilog語言
    +關(guān)注

    關(guān)注

    0

    文章

    113

    瀏覽量

    8254
  • 門級電路
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    1989

原文標題:數(shù)字硬件建模SystemVerilog-組合邏輯建模(4)組合邏輯決策優(yōu)先級

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

收藏 人收藏

    評論

    相關(guān)推薦

    基于優(yōu)先級搶占系統(tǒng)的QNX調(diào)度算法

    調(diào)度算法,是基于優(yōu)先級的。QNX的線程優(yōu)先級,是一個0-255的數(shù)字,數(shù)字越大優(yōu)先級越高。所以,優(yōu)先級0是內(nèi)核中的idle線程。同時,優(yōu)先級
    發(fā)表于 10-31 09:17 ?735次閱讀

    RTOS應用中的優(yōu)先級反轉(zhuǎn)問題

    在嵌入式系統(tǒng)中,如果使用基于優(yōu)先級調(diào)度算法的RTOS,系統(tǒng)中可能發(fā)生優(yōu)先級反轉(zhuǎn)現(xiàn)象。優(yōu)先級反轉(zhuǎn)用來描述系統(tǒng)中高優(yōu)先級任務由于等待低優(yōu)先級任務
    發(fā)表于 12-14 11:00 ?1219次閱讀

    優(yōu)先級參數(shù)配對組合測試集生成策略

    在參數(shù)組合測試的實際應用中,時間或預算等原因可能導致無法運行整個測試集,造成重要測試案例的漏執(zhí)行。該文引用優(yōu)先級權(quán)值的思想為測試案例設(shè)置優(yōu)先級,介紹2種生成有序
    發(fā)表于 04-18 08:47 ?10次下載

    STM32F10X的中斷優(yōu)先級

    STM32(Cortex-M3)中有兩個優(yōu)先級的概念搶占式優(yōu)先級和響應優(yōu)先級,有人把響應優(yōu)先級稱作亞優(yōu)先級或副
    發(fā)表于 11-04 15:02 ?41次下載

    stm32定時器優(yōu)先級

    什么是優(yōu)先級 優(yōu)先級是具有高搶占式優(yōu)先級的中斷可以在具有低搶占式優(yōu)先級的中斷處理過程中被響應,即中斷嵌套,或者說高搶占式優(yōu)先級的中斷可以嵌套
    發(fā)表于 10-13 11:48 ?5361次閱讀

    DSP中斷如何設(shè)置優(yōu)先級

    原以為2812中斷不能設(shè)置優(yōu)先級。實際上硬件上優(yōu)先級是做好的。但軟件上有辦法來設(shè)置優(yōu)先級。
    發(fā)表于 04-08 17:20 ?20次下載

    cortex M內(nèi)核優(yōu)先級設(shè)置

    Cortex M內(nèi)核中每個中斷都有一個8位的優(yōu)先級設(shè)置寄存器這個8位的寄存器可以分為搶占優(yōu)先級和子優(yōu)先級兩個部分(通過設(shè)置優(yōu)先級組設(shè)置)搶占優(yōu)先級
    發(fā)表于 12-01 11:51 ?4次下載
    cortex M內(nèi)核<b class='flag-5'>優(yōu)先級</b>設(shè)置

    2.FreeRTOS中斷優(yōu)先級和任務優(yōu)先級

    FreeRTOS中斷優(yōu)先級和任務優(yōu)先級架構(gòu):Cortex-M3版本:FreeRTOS V9.0.0前言:最開始,我并沒有搞清楚什么是中斷優(yōu)先級和任務優(yōu)先級,但看了部分資料后發(fā)現(xiàn)這兩個并
    發(fā)表于 12-04 20:21 ?9次下載
    2.FreeRTOS中斷<b class='flag-5'>優(yōu)先級</b>和任務<b class='flag-5'>優(yōu)先級</b>

    STM32F103芯片中斷優(yōu)先級以及FreeRTOS優(yōu)先級設(shè)置

    STM32F103只用了4個位來表達優(yōu)先級,因此最多支持16的可編程優(yōu)先級(0~15),15為最低優(yōu)先級。
    發(fā)表于 01-25 18:59 ?1次下載
    STM32F103芯片中斷<b class='flag-5'>優(yōu)先級</b>以及FreeRTOS<b class='flag-5'>優(yōu)先級</b>設(shè)置

    uC/OS-II學習筆記——優(yōu)先級反轉(zhuǎn)與優(yōu)先級繼承機制

    優(yōu)先級反轉(zhuǎn),是指某同步資源被較低優(yōu)先級的進程/線程所擁有,較高優(yōu)先級的進程/線程競爭該同步資源未獲得該資源,而使得較高優(yōu)先級進程/線程反而推遲被調(diào)度執(zhí)行的現(xiàn)象。
    發(fā)表于 02-09 10:33 ?2次下載
    uC/OS-II學習筆記——<b class='flag-5'>優(yōu)先級</b>反轉(zhuǎn)與<b class='flag-5'>優(yōu)先級</b>繼承機制

    中斷優(yōu)先級處理的原則及配置 搶占優(yōu)先級和響應優(yōu)先級的區(qū)別

    首先我們需要知道什么是中斷優(yōu)先級:中斷優(yōu)先級是CPU響應中斷的先后順序
    的頭像 發(fā)表于 05-18 15:10 ?2.8w次閱讀
    中斷<b class='flag-5'>優(yōu)先級</b>處理的原則及配置 搶占<b class='flag-5'>優(yōu)先級</b>和響應<b class='flag-5'>優(yōu)先級</b>的區(qū)別

    FreeRTOS任務的優(yōu)先級示例

    任務的優(yōu)先級:0~24之間。數(shù)字越大,任務優(yōu)先等級越高。高優(yōu)先級的任務優(yōu)先執(zhí)行。
    的頭像 發(fā)表于 09-15 11:13 ?2815次閱讀

    Free RTOS的優(yōu)先級翻轉(zhuǎn)

    優(yōu)先級翻轉(zhuǎn)簡介:就是高優(yōu)先級的任務運行起來的效果好像成了低優(yōu)先級,而低優(yōu)先級比高優(yōu)先級先運行;
    的頭像 發(fā)表于 02-10 15:31 ?1334次閱讀
    Free RTOS的<b class='flag-5'>優(yōu)先級</b>翻轉(zhuǎn)

    什么是優(yōu)先級反轉(zhuǎn)

    假設(shè)現(xiàn)在有三個任務TaskA(優(yōu)先級高)、TaskB(優(yōu)先級中)、TaskC(優(yōu)先級低),一個信號量(Semaphore),此信號量用于任務之間爭奪某個資源。在某一時刻,高優(yōu)先級的Ta
    的頭像 發(fā)表于 04-24 13:01 ?2286次閱讀
    什么是<b class='flag-5'>優(yōu)先級</b>反轉(zhuǎn)

    python中運算符的優(yōu)先級大小

    解。 Python中的運算符可以分為以下幾類:算術(shù)運算符、比較運算符、邏輯運算符、位運算符、賦值運算符以及成員訪問運算符。這些運算符有不同的優(yōu)先級。下面我們將詳細介紹每個運算符的優(yōu)先級
    的頭像 發(fā)表于 11-29 16:21 ?3443次閱讀