數字門級電路可分為兩大類:組合邏輯和時序邏輯。鎖存器是組合邏輯和時序邏輯的一個交叉點,在后面會作為單獨的主題處理。
組合邏輯描述了門級電路,其中邏輯塊的輸出直接反映到該塊的輸入值的組合,例如,雙輸入AND門的輸出是兩個輸入的邏輯與。如果輸入值發生變化,輸出值將反映這一變化,組合邏輯的RTL模型需要反映這種門級行為,這意味著邏輯塊的輸出必須始終反映該邏輯塊當前輸入值的組合。
SystemVerilog有三種在可綜合RTL級別表示組合邏輯的方法:連續賦值語句、always程序塊和函數。接下來幾篇文章將探討每種編碼風格,并推薦最佳實踐編碼風格。
組合邏輯決策優先級
SystemVerilog對if-else-if決策序列和case語句的語義是:按順序計算一系列選擇-只執行第一個匹配的分支。這種行為使得表示優先級編碼邏輯成為可能,即其中一種選擇優先于另一種選擇。下面的代碼片段演示了一個以if-else-if決策鏈建模的4-2優先級編碼器,其中高階位優先于低階位。
同樣的優先級編碼器也可以通過使用case語句來建模。(下例使用了一種稱為reverse case語句的編碼風格)。
if-else-if示例和case語句示例在功能上相同,并將綜合為等效的門級電路。
從case語句中刪除不必要的優先編碼
上面的優先級編碼器示例取決于if-else-if決策和case語句的優先級評估流程。然而,大多數決策序列并不依賴于這種仿真語義,即按照決策選項的列出順序對其進行評估。有限狀態機(FSM)的獨熱碼狀態解碼器說明了這一點,每一個單次值都是唯一的。因此,case選項是相互排斥的——沒有兩個case選項可以同時為真。對于互斥的case選項, case選項的順序無關緊要,case語句的優先級性質也無關緊要。
下面的示例顯示了一個簡單的獨熱碼狀態機解碼器,獨熱碼編碼在枚舉類型標簽的文本值中。
綜合編譯器優化case語句優先級。在將RTL case語句轉換為門級實現時,綜合編譯器將在需要時保留優先級編碼的求值,例如前面顯示的BCD示例。然而,當case選項相互排斥時,綜合編譯器將自動刪除優先級編碼,并創建并行邏輯來評估case選項。與優先級編碼電路相比,并行電路速度更快,所需要的門數更少。
unique和unique0的決策修飾符
在一些罕見的情況下,不需要對case語句進行隱式優先級編碼,但綜合編譯器無法靜態地確定case選項在所有條件下都是互斥的,當這種情況發生時,綜合編譯器將在門級實現中保留優先級編碼邏輯,以備不時之需。這種情況通常發生在以下情況之一:
case選項表達式使用通配符位。 case-inside決策允許使用通配符位,因為這些位可以是任何值,所以case表達式可能匹配多個case項。
如果case選項表達式使用變量,則綜合是一個靜態編譯過程,因此無法確定變量的值是否永遠不會重疊。
例7-3是一個reverse case語句,其中case項是具有一個變量的獨熱碼。
示例7-3:具有優先級編碼邏輯(部分代碼)的狀態解碼器
//`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項是互斥的。然而,綜合編譯器不能靜態地確定當前狀態變量的值在所有情況下都是互斥的。因此,綜合器將使用優先級編碼邏輯實現這一獨熱碼解碼器。case語句不會被自動優化為并行計算。圖7-3顯示了綜合這種reverse case的結果。
圖7-3:例7-3的綜合結果:具有優先級的case語句
因為綜合編譯器無法識別current_state變量只會有一個單獨的值,因此,case項是互斥的。
unique的決策參數。
當綜合無法自動檢測到case項值是互斥的時,設計工程師需要通知綜合編譯器,case項之間確實是唯一的。這可以通過在case關鍵字之前添加一個unique的決策修飾符來實現,如下例所示:
示例7-4:具有unique并行編碼邏輯的狀態解碼器
//`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顯示了綜合該示例的結果。
圖7-4:示例7-4的綜合結果:使用unique
使用unique會指示綜合編譯器可以并行計算case項。與圖7-3所示的優先級實現相比,這顯著減少了該獨熱碼解碼器的門數和傳播路徑的數量。
對于綜合,unique修飾符表示每個case項表達式都將具有互斥的“唯一”值,因此門級實現可以并行計算case項,unique修飾符進一步通知綜合,在case狀態中未使用的任何案例表達式值,可以忽略不計。但在某些設計中,這可能會觸發綜合優化,從而減少門數和傳播路徑。
對于仿真,unique支持運行時錯誤檢查。如果出現以下情況,將報告違規信息:
絕不會有多個case 項表達式同時為true
出現的每個case表達式值都有一個分支。
最佳實踐指南7-9 |
---|
只有在確定綜合邏輯優化效果是理想的情況下,才能使用unique的決策修飾符。 |
大多數情況下,不需要也不應該在case語句中使用unique 決策修飾符——unique修飾符可能會導致綜合優化,這在許多設計中可能并不可取。
示例7-3和7-4中所示的reverse case語句編碼風格是綜合編譯器需要決策修飾符以實現最佳結果質量(QoR)的少數例外之一。
unique0決策修飾符
SystemVerilog-2009添加了一個unique0決策修飾符。與unique一樣,unique0決策修飾符通知綜合編譯器,每個case項表達式都有一個排斥的、唯一的值,在門級實現之前,可以并行計算case項,但與unique不同,unique0修飾符不會通知綜合忽略case語句中未使用的case表達式值。
對于仿真,unique0決策修飾符只支持運行時錯誤檢查,以確保不存在多個case項表達式同時為真。如果對case語句進行了計算,并且沒有匹配的case項,則不會出現運行時違規消息。
最佳實踐指南7-10 |
---|
在RTL模型中使用unique的決策修飾符。不要使用unique0決策修飾符。unique0修飾符在 未來可能會被推薦使用,但在本文撰寫時,一些仿真器和大多數綜合編譯器不支持unique0。 |
過時的parallel_case 綜合注釋
(pragma就是為了讓編譯器編譯出的程序與機器硬件和操作系統保持完全兼容而定義的宏擴展)
SystemVerilog在最初的Verilog語言中添加了unique和unique0的決策修飾符。在傳統的Verilog中,設計工程師告訴綜合編譯器所有case項都可以被視為互斥的唯一方法是通過parallel_case的synthesis pragma語句。synthesis pragma是以synthesis一詞開頭的特殊注釋。仿真器會忽略注釋,但綜合編譯器會對這些專用的synthesis pragma進行操作。
case(
筆記 在寫本文的時候,一個商業綜合編譯器并不認為// 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,因為在編寫本文時,大多數綜合編譯器都不支持它。)
審核編輯:劉清
-
編碼器
+關注
關注
45文章
3639瀏覽量
134440 -
鎖存器
+關注
關注
8文章
906瀏覽量
41497 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8224 -
門級電路
+關注
關注
0文章
15瀏覽量
1963
原文標題:數字硬件建模SystemVerilog-組合邏輯建模(4)組合邏輯決策優先級
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論