數(shù)字門級(jí)電路可分為兩大類:組合邏輯和時(shí)序邏輯。鎖存器是組合邏輯和時(shí)序邏輯的一個(gè)交叉點(diǎn),在后面會(huì)作為單獨(dú)的主題處理。
組合邏輯描述了門級(jí)電路,其中邏輯塊的輸出直接反映到該塊的輸入值的組合,例如,雙輸入AND門的輸出是兩個(gè)輸入的邏輯與。如果輸入值發(fā)生變化,輸出值將反映這一變化,組合邏輯的RTL模型需要反映這種門級(jí)行為,這意味著邏輯塊的輸出必須始終反映該邏輯塊當(dāng)前輸入值的組合。
SystemVerilog有三種在可綜合RTL級(jí)別表示組合邏輯的方法:連續(xù)賦值語句、always程序塊和函數(shù)。接下來幾篇文章將探討每種編碼風(fēng)格,并推薦最佳實(shí)踐編碼風(fēng)格。
組合邏輯決策優(yōu)先級(jí)
SystemVerilog對(duì)if-else-if決策序列和case語句的語義是:按順序計(jì)算一系列選擇-只執(zhí)行第一個(gè)匹配的分支。這種行為使得表示優(yōu)先級(jí)編碼邏輯成為可能,即其中一種選擇優(yōu)先于另一種選擇。下面的代碼片段演示了一個(gè)以if-else-if決策鏈建模的4-2優(yōu)先級(jí)編碼器,其中高階位優(yōu)先于低階位。
同樣的優(yōu)先級(jí)編碼器也可以通過使用case語句來建模。(下例使用了一種稱為reverse case語句的編碼風(fēng)格)。
if-else-if示例和case語句示例在功能上相同,并將綜合為等效的門級(jí)電路。
從case語句中刪除不必要的優(yōu)先編碼
上面的優(yōu)先級(jí)編碼器示例取決于if-else-if決策和case語句的優(yōu)先級(jí)評(píng)估流程。然而,大多數(shù)決策序列并不依賴于這種仿真語義,即按照決策選項(xiàng)的列出順序?qū)ζ溥M(jìn)行評(píng)估。有限狀態(tài)機(jī)(FSM)的獨(dú)熱碼狀態(tài)解碼器說明了這一點(diǎn),每一個(gè)單次值都是唯一的。因此,case選項(xiàng)是相互排斥的——沒有兩個(gè)case選項(xiàng)可以同時(shí)為真。對(duì)于互斥的case選項(xiàng), case選項(xiàng)的順序無關(guān)緊要,case語句的優(yōu)先級(jí)性質(zhì)也無關(guān)緊要。
下面的示例顯示了一個(gè)簡(jiǎn)單的獨(dú)熱碼狀態(tài)機(jī)解碼器,獨(dú)熱碼編碼在枚舉類型標(biāo)簽的文本值中。
綜合編譯器優(yōu)化case語句優(yōu)先級(jí)。在將RTL case語句轉(zhuǎn)換為門級(jí)實(shí)現(xiàn)時(shí),綜合編譯器將在需要時(shí)保留優(yōu)先級(jí)編碼的求值,例如前面顯示的BCD示例。然而,當(dāng)case選項(xiàng)相互排斥時(shí),綜合編譯器將自動(dòng)刪除優(yōu)先級(jí)編碼,并創(chuàng)建并行邏輯來評(píng)估case選項(xiàng)。與優(yōu)先級(jí)編碼電路相比,并行電路速度更快,所需要的門數(shù)更少。
unique和unique0的決策修飾符
在一些罕見的情況下,不需要對(duì)case語句進(jìn)行隱式優(yōu)先級(jí)編碼,但綜合編譯器無法靜態(tài)地確定case選項(xiàng)在所有條件下都是互斥的,當(dāng)這種情況發(fā)生時(shí),綜合編譯器將在門級(jí)實(shí)現(xiàn)中保留優(yōu)先級(jí)編碼邏輯,以備不時(shí)之需。這種情況通常發(fā)生在以下情況之一:
case選項(xiàng)表達(dá)式使用通配符位。 case-inside決策允許使用通配符位,因?yàn)檫@些位可以是任何值,所以case表達(dá)式可能匹配多個(gè)case項(xiàng)。
如果case選項(xiàng)表達(dá)式使用變量,則綜合是一個(gè)靜態(tài)編譯過程,因此無法確定變量的值是否永遠(yuǎn)不會(huì)重疊。
例7-3是一個(gè)reverse case語句,其中case項(xiàng)是具有一個(gè)變量的獨(dú)熱碼。
示例7-3:具有優(yōu)先級(jí)編碼邏輯(部分代碼)的狀態(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è)計(jì)者可能知道current_state使用獨(dú)熱碼,因此case項(xiàng)是互斥的。然而,綜合編譯器不能靜態(tài)地確定當(dāng)前狀態(tài)變量的值在所有情況下都是互斥的。因此,綜合器將使用優(yōu)先級(jí)編碼邏輯實(shí)現(xiàn)這一獨(dú)熱碼解碼器。case語句不會(huì)被自動(dòng)優(yōu)化為并行計(jì)算。圖7-3顯示了綜合這種reverse case的結(jié)果。
圖7-3:例7-3的綜合結(jié)果:具有優(yōu)先級(jí)的case語句
因?yàn)榫C合編譯器無法識(shí)別current_state變量只會(huì)有一個(gè)單獨(dú)的值,因此,case項(xiàng)是互斥的。
unique的決策參數(shù)。
當(dāng)綜合無法自動(dòng)檢測(cè)到case項(xiàng)值是互斥的時(shí),設(shè)計(jì)工程師需要通知綜合編譯器,case項(xiàng)之間確實(shí)是唯一的。這可以通過在case關(guān)鍵字之前添加一個(gè)unique的決策修飾符來實(shí)現(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é)果。
圖7-4:示例7-4的綜合結(jié)果:使用unique
使用unique會(huì)指示綜合編譯器可以并行計(jì)算case項(xiàng)。與圖7-3所示的優(yōu)先級(jí)實(shí)現(xiàn)相比,這顯著減少了該獨(dú)熱碼解碼器的門數(shù)和傳播路徑的數(shù)量。
對(duì)于綜合,unique修飾符表示每個(gè)case項(xiàng)表達(dá)式都將具有互斥的“唯一”值,因此門級(jí)實(shí)現(xiàn)可以并行計(jì)算case項(xiàng),unique修飾符進(jìn)一步通知綜合,在case狀態(tài)中未使用的任何案例表達(dá)式值,可以忽略不計(jì)。但在某些設(shè)計(jì)中,這可能會(huì)觸發(fā)綜合優(yōu)化,從而減少門數(shù)和傳播路徑。
對(duì)于仿真,unique支持運(yùn)行時(shí)錯(cuò)誤檢查。如果出現(xiàn)以下情況,將報(bào)告違規(guī)信息:
絕不會(huì)有多個(gè)case 項(xiàng)表達(dá)式同時(shí)為true
出現(xiàn)的每個(gè)case表達(dá)式值都有一個(gè)分支。
最佳實(shí)踐指南7-9 |
---|
只有在確定綜合邏輯優(yōu)化效果是理想的情況下,才能使用unique的決策修飾符。 |
大多數(shù)情況下,不需要也不應(yīng)該在case語句中使用unique 決策修飾符——unique修飾符可能會(huì)導(dǎo)致綜合優(yōu)化,這在許多設(shè)計(jì)中可能并不可取。
示例7-3和7-4中所示的reverse case語句編碼風(fēng)格是綜合編譯器需要決策修飾符以實(shí)現(xiàn)最佳結(jié)果質(zhì)量(QoR)的少數(shù)例外之一。
unique0決策修飾符
SystemVerilog-2009添加了一個(gè)unique0決策修飾符。與unique一樣,unique0決策修飾符通知綜合編譯器,每個(gè)case項(xiàng)表達(dá)式都有一個(gè)排斥的、唯一的值,在門級(jí)實(shí)現(xiàn)之前,可以并行計(jì)算case項(xiàng),但與unique不同,unique0修飾符不會(huì)通知綜合忽略case語句中未使用的case表達(dá)式值。
對(duì)于仿真,unique0決策修飾符只支持運(yùn)行時(shí)錯(cuò)誤檢查,以確保不存在多個(gè)case項(xiàng)表達(dá)式同時(shí)為真。如果對(duì)case語句進(jìn)行了計(jì)算,并且沒有匹配的case項(xiàng),則不會(huì)出現(xiàn)運(yùn)行時(shí)違規(guī)消息。
最佳實(shí)踐指南7-10 |
---|
在RTL模型中使用unique的決策修飾符。不要使用unique0決策修飾符。unique0修飾符在 未來可能會(huì)被推薦使用,但在本文撰寫時(shí),一些仿真器和大多數(shù)綜合編譯器不支持unique0。 |
過時(shí)的parallel_case 綜合注釋
(pragma就是為了讓編譯器編譯出的程序與機(jī)器硬件和操作系統(tǒng)保持完全兼容而定義的宏擴(kuò)展)
SystemVerilog在最初的Verilog語言中添加了unique和unique0的決策修飾符。在傳統(tǒng)的Verilog中,設(shè)計(jì)工程師告訴綜合編譯器所有case項(xiàng)都可以被視為互斥的唯一方法是通過parallel_case的synthesis pragma語句。synthesis pragma是以synthesis一詞開頭的特殊注釋。仿真器會(huì)忽略注釋,但綜合編譯器會(huì)對(duì)這些專用的synthesis pragma進(jìn)行操作。
case(
筆記 在寫本文的時(shí)候,一個(gè)商業(yè)綜合編譯器并不認(rèn)為// synthesis是綜合注釋。該編譯器要求pragma以// pragma或// synopsys開頭。 警告-使用注釋向綜合編譯器提供指令存在危險(xiǎn)。Parallel_case之類的注釋可以對(duì)case語句的門級(jí)實(shí)現(xiàn)產(chǎn)生重大影響。這些效果在仿真中無法驗(yàn)證!對(duì)于仿真器來說,綜合注釋不過是一種注釋。RTL級(jí)別的設(shè)計(jì)驗(yàn)證不是驗(yàn)證與門級(jí)實(shí)現(xiàn)相同的功能。
unique和unigue0決策修飾符取代了parallel_case綜合注釋——這些決策修飾符是語言的活躍部分,而不是以注釋出現(xiàn)。
unique0 case在綜合中的效果與parallel_case相同,此外,unique0支持運(yùn)行時(shí)仿真檢查,確保每次計(jì)算case語句時(shí),case表達(dá)式最多只匹配一個(gè)case項(xiàng)(如果case表達(dá)式不匹配任何case項(xiàng),則不是錯(cuò)誤)。
unique case在綜合中的效果與兩個(gè)綜合注釋相同, parallel_case和full_case。unique修飾符允許運(yùn)行時(shí)仿真檢查,即在每次計(jì)算case語句時(shí),case表達(dá)式正好與一個(gè)case項(xiàng)相匹配。
最佳實(shí)踐指南7-11 不要使用過時(shí)的parallel_case綜合注釋! 綜合編譯器非常擅長(zhǎng)自動(dòng)檢測(cè)case語句何時(shí)可以作為并行解碼器實(shí)現(xiàn),而不影響設(shè)計(jì)功能,在極少數(shù)情況下,需要告知綜合編譯器使用并行實(shí)現(xiàn)時(shí),請(qǐng)使用unique決策修飾符。unique決策修飾符通知綜合編譯器,case項(xiàng)可以像parallel_case綜合注釋一樣被視為互斥的,但決策修飾符添加了仿真運(yùn)行時(shí)檢查,以幫助檢測(cè)RTL仿真期間case項(xiàng)并行解碼的潛在問題。
(unique0 決策修飾符更準(zhǔn)確地描述了parallel_case綜合注釋,但本文不建議使用unique0,因?yàn)樵诰帉懕疚臅r(shí),大多數(shù)綜合編譯器都不支持它。)
審核編輯:劉清
-
編碼器
+關(guān)注
關(guān)注
45文章
3753瀏覽量
136680 -
鎖存器
+關(guān)注
關(guān)注
8文章
919瀏覽量
42027 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8456 -
門級(jí)電路
+關(guān)注
關(guān)注
0文章
15瀏覽量
2041
原文標(biāo)題:數(shù)字硬件建模SystemVerilog-組合邏輯建模(4)組合邏輯決策優(yōu)先級(jí)
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
RTOS應(yīng)用中的優(yōu)先級(jí)反轉(zhuǎn)問題
優(yōu)先級(jí)參數(shù)配對(duì)組合測(cè)試集生成策略
路由優(yōu)先級(jí)

STM32F10X的中斷優(yōu)先級(jí)
stm32定時(shí)器優(yōu)先級(jí)
DSP中斷如何設(shè)置優(yōu)先級(jí)
cortex M內(nèi)核優(yōu)先級(jí)設(shè)置

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

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

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

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

FreeRTOS任務(wù)的優(yōu)先級(jí)示例
Free RTOS的優(yōu)先級(jí)翻轉(zhuǎn)

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

評(píng)論