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

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

3天內不再提示

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

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

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

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

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

組合邏輯決策優(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)先級評估流程。然而,大多數決策序列并不依賴于這種仿真語義,即按照決策選項的列出順序對其進行評估。有限狀態(tài)機(FSM)的獨熱碼狀態(tài)解碼器說明了這一點,每一個單次值都是唯一的。因此,case選項是相互排斥的——沒有兩個case選項可以同時為真。對于互斥的case選項, case選項的順序無關緊要,case語句的優(yōu)先級性質也無關緊要。

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

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

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

unique和unique0的決策修飾符

在一些罕見的情況下,不需要對case語句進行隱式優(yōu)先級編碼,但綜合編譯器無法靜態(tài)地確定case選項在所有條件下都是互斥的,當這種情況發(fā)生時,綜合編譯器將在門級實現中保留優(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

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

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

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

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

unique的決策參數。

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

示例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顯示了綜合該示例的結果。

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

圖7-4:示例7-4的綜合結果:使用unique

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

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

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

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

出現的每個case表達式值都有一個分支。

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

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

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

unique0決策修飾符

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

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

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

過時的parallel_case 綜合注釋

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

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

case(

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

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

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

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語句何時可以作為并行解碼器實現,而不影響設計功能,在極少數情況下,需要告知綜合編譯器使用并行實現時,請使用unique決策修飾符。unique決策修飾符通知綜合編譯器,case項可以像parallel_case綜合注釋一樣被視為互斥的,但決策修飾符添加了仿真運行時檢查,以幫助檢測RTL仿真期間case項并行解碼的潛在問題。

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






審核編輯:劉清

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

    關注

    44

    文章

    3529

    瀏覽量

    133298
  • 鎖存器
    +關注

    關注

    8

    文章

    903

    瀏覽量

    41315
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8192
  • 門級電路
    +關注

    關注

    0

    文章

    15

    瀏覽量

    1949

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

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    路由優(yōu)先級

    路由優(yōu)先級 前面講過,各個路由協議都有自己的標準來衡量路由的好壞(
    發(fā)表于 06-09 23:47 ?2865次閱讀
    路由<b class='flag-5'>優(yōu)先級</b>

    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 ?5240次閱讀

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

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

    cortex M內核優(yōu)先級設置

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

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

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

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

    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>設置

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

    優(yōu)先級反轉,是指某同步資源被較低優(yōu)先級的進程/線程所擁有,較高優(yōu)先級的進程/線程競爭該同步資源未獲得該資源,而使得較高優(yōu)先級進程/線程反而推遲被調度執(zhí)行的現象。
    發(fā)表于 02-09 10:33 ?2次下載
    uC/OS-II學習筆記——<b class='flag-5'>優(yōu)先級</b>反轉與<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.6w次閱讀
    中斷<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之間。數字越大,任務優(yōu)先等級越高。高優(yōu)先級的任務優(yōu)先執(zhí)行。
    的頭像 發(fā)表于 09-15 11:13 ?2628次閱讀

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

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

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

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

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

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