HDL設(shè)計探究
一.可移植性編碼
1.只使用IEEE標(biāo)準(zhǔn)類型(VHDL):(1)使用STD_LOGIC類型,而不是STD_ULOGIC類型;(2)設(shè)計中不要創(chuàng)建過多的的子類型;(3)不要使用BIT和BIT_VECTOR類型。
2.不使用立即數(shù):在設(shè)計中,不要使用立即數(shù)(但作為例外,可使用0和1),推薦使用常量。使用常量有以下優(yōu)點:(1)常量對于一個設(shè)計具有更多的靈活性;(2)常量值只需要在一個地方修改;(3)編譯器可能只支持常量類型,不支持立即數(shù)。
3.對于VHDL程序,把常數(shù)和參數(shù)定義在由1個或多個文件組成的程序包中。
4. 對于Verilog程序,把常數(shù)和參數(shù)定義在1個或多個小文件中。例如,文件名稱為DesignName_Constant.V或DesignName_Parameters.v。
5.避免在代碼中嵌入綜合命令。
6.使用工藝無關(guān)庫:(1)對于算法元件,使用Designware Foundation Library;(2)設(shè)計中應(yīng)避免使用實體化的門設(shè)計;(3)如果設(shè)計中必須使用某些特殊工藝門,那么你可以將它隔離在某個單獨(dú)模塊中;(4)如果必須實例化門電路,可以使用SYNOPSYS通用工藝庫GTECH。
7.注意Verilog程序和VHDL程序的差異性,保證編碼的可轉(zhuǎn)換性:(1)Verilog程序轉(zhuǎn)換到VHDL程序:在Verilog程序設(shè)計中,元件端口映射時,不要使用任何邏輯表達(dá)式;不同的狀態(tài)機(jī)之間,使用惟一狀態(tài)名命名;函數(shù)在調(diào)用時,只能傳遞函數(shù)名、函數(shù)參數(shù)和局部寄存器變量;任務(wù)在調(diào)用時,只能傳遞任務(wù)參數(shù)和任務(wù)內(nèi)部寄存器變量。(2)VHDL程序轉(zhuǎn)換到Verilog程序:在VHDL程序設(shè)計中,不要使用GENERATE聲明;不要使用BLOCK塊;不要用代碼修改CONSTANT聲明的變量。
二. 時鐘和RESET信號設(shè)計指南
1.避免使用混合時鐘沿:(1)在你的設(shè)計中,要避免同時使用上升沿觸發(fā)和下降沿觸發(fā)這兩種觸發(fā)方式的寄存器。若設(shè)計中必須同時使用上升沿和下降沿進(jìn)行觸發(fā),則必須確保綜合和時序分析后的該模塊的時序周期在最壞狀態(tài)下也是正確的,必須在給用戶的文檔中詳細(xì)描述對該設(shè)計中時序信號占空比的要求;(2)如果在你的設(shè)計中必須同時使用大量的上升沿和下降沿出發(fā)的觸發(fā)器,那么應(yīng)該把他們放在不同的模塊中。
2,避免使用時鐘緩沖器:避免在RTL代碼中直接引入時鐘緩沖器。時鐘緩沖器通常是在綜合完成之后,作為物理設(shè)計中的部分工作插入到設(shè)計中的。
3.避免使用門控時鐘:避免在RTL代碼中直接使用門控時鐘。門控時鐘電纜是一種工藝相關(guān)和時序相關(guān)的電路。
4.避免在模塊內(nèi)部產(chǎn)生時鐘:在你的設(shè)計中,避免使用內(nèi)部產(chǎn)生時鐘的方法。內(nèi)部產(chǎn)生的時鐘可能導(dǎo)致可測性限制。
5.門控時鐘和低功耗設(shè)計:(1)如果必須使用門控時鐘或內(nèi)部時鐘,或者RESET信號,就應(yīng)該把內(nèi)部時鐘電路或RESET電路分離出來,將它們作為頂層下的獨(dú)立模塊進(jìn)行設(shè)計。將設(shè)計細(xì)分。保證所有單一模塊,只使用一個時鐘和一個RESET信號。(2)如果你的設(shè)計中需要門控時鐘,那么就要在RTL代碼中使用同步加載寄存器。
6.避免在模塊內(nèi)部產(chǎn)生RESET信號:(1)如果可能,盡量避免在模塊內(nèi)部產(chǎn)生RESET信號,或者避免用其它條件邏輯產(chǎn)生RESET信號;(2)如果確實需要條件RESET信號,那么可以創(chuàng)建一個獨(dú)立的RESET信號,再創(chuàng)建一個獨(dú)立的條件RESET產(chǎn)生邏輯模塊。
7.RESET邏輯功能:RESET信號的邏輯功能應(yīng)該是直接清除所有的寄存器。不要把RESET信號作為狀態(tài)機(jī)的輸入。
8.一位同步器:使用兩級觸發(fā),在兩個時鐘域之間傳遞一位數(shù)據(jù)。如圖 所示。把這些觸發(fā)器用不同名字區(qū)別開,這樣有利于集成時對這些亞穩(wěn)態(tài)的觸發(fā)器特性進(jìn)行分析。為了防止毛刺的傳播,不要將組合邏輯從一個時鐘域連接到另一個時鐘域。
9.多位同步器:在傳輸兩個時鐘域之間的多位數(shù)據(jù)時,不要使用上述的一位同步器傳輸方法,而應(yīng)該使用一種可靠的握手電路或者像格雷碼那樣的多位編碼方式。
三.可綜合性編碼
1.寄存器描述:時序邏輯電路最好采用寄存器(觸發(fā)器)傳輸?shù)姆绞皆O(shè)計。
2.避免產(chǎn)生鎖存器:(1)在你的設(shè)計中,避免使用任何鎖存器。但可以使用工藝無關(guān)的GETCH D鎖存器。(2)通過使用下列編碼技術(shù),可以避免產(chǎn)生鎖存器:在VHDL程序中,將默認(rèn)值賦值語句寫在過程的開始;在VERILOG程序中,對所有可能的輸入條件,都有明確的輸出;在VHDL程序中,對于條件語句的最后一個分支,使用ELSE語句(而不時使用ELSIF語句)。
3.如果必須使用鎖存器:可使用多選的方法,提供一般功能或I/O借口的數(shù)據(jù)。多選器的選擇控制位來自于掃描控制使能的測試模式管腳。
4.避免產(chǎn)生組合邏輯電路反饋:組合電路反饋是指組合邏輯電路形式的反饋環(huán)路。組合反饋環(huán)路會引起一系列問題,包括會使精確靜態(tài)時序分析難以實現(xiàn)。
5.完整的敏感信號列表:(1)規(guī)則:每個process(VHDL)和always(Verilog)模塊中的敏感信號列表必須完整。(2)對于組合邏輯模塊(模塊中不包括寄存器或鎖存器),敏感信號列表必須包括過程中用到的每個信號,也就是出現(xiàn)在賦值語句右側(cè)的信號或條件表達(dá)式中用到的信號,都應(yīng)該列在敏感信號列表中。(3)對于時序邏輯模塊,敏感信號列表必須包括過程中用到的時鐘信號。如果時序過程模塊還要用到異步RESET信號,那么敏感信號列表中還應(yīng)該包括RESET信號。(4)確保過程模塊敏感信號列表中的信號是必需的。敏感信號列表中沒必要出現(xiàn)的信號會降低仿真速度。
6.阻塞和非阻塞賦值(Verilog):在書寫Verilog可綜合代碼時,在always@(posedge clk)模塊中,總是使用非阻塞賦值方式,否則會產(chǎn)生RTL級仿真和門級仿真功能不一樣的現(xiàn)象。
7.信號和變量賦值(VHDL):在書寫VHDL可綜合代碼時,建議使用信號量,而不時使用變量,以確保綜合前的仿真與綜合后的仿真相一致。如果你覺得使用了變量后,仿真速度得到了非常顯著的提高,那么也可以使用變量。
8.CASE語句和IF-THEN-ELSE語句:(1)VHDL語言和Verilog語言中的CASE語句對應(yīng)一個單級的多選電路,IF-THEN-ELSE語句對應(yīng)于一個優(yōu)先編碼的多級組合選擇電路。(2)多選器是一個相對更快的電路,因此,在不需要使用優(yōu)先級編碼結(jié)構(gòu)時,推薦使用CASE語句,而不要使用IF-THEN-ELSE語句進(jìn)行描述。如果你有一個遲到的信號時,使用IF-THEN-ELSE語句可能會有用。
9.時序邏輯電路的HDL語言描述:(1)包括像狀態(tài)機(jī)這樣的時序邏輯,都可以用一個時序過程進(jìn)行描述。為了提高程序的可讀性,應(yīng)該把一些對中間變量賦值的語句移到時序邏輯描述的過程之外。(2)在VHDL語言中,把各狀態(tài)變量定義為類型。在Verilog語言中,用DEFINE命令定義各狀態(tài)變量。(3)隊員包含F(xiàn)SM(有限狀態(tài)機(jī))和非FSM邏輯的模塊,在綜合時有不同的要求,應(yīng)該把它們單獨(dú)放在不同的模塊中。
10.對關(guān)鍵信號的描述:讓后到達(dá)信號盡量靠近模塊的輸出端口。例如,在IF-THEN-ELSE模塊中,讓后到達(dá)信號具有較高優(yōu)先級。
11.避免使用延遲語句:在RTL編碼中,不要使用任何延遲語句。
12.避免使用FULL_CASE和PARALLEL_CASE結(jié)構(gòu)編程:以VHDL語句中的CASE語句的使用方法書寫VERILOG語言中的CASE語句結(jié)構(gòu)。
四. 可綜合劃分
好的可綜合劃分會給你帶來許多優(yōu)勢,它包括:(1)更好的綜合結(jié)果;(2)更少的編程運(yùn)行時間;(3)只要使用更簡單的綜合策略就可以滿足設(shè)計的時序要求。
1.所有輸出采用寄存器輸出:對于采用層次化結(jié)構(gòu)的核設(shè)計,子模塊中所有的輸出信號都應(yīng)該使用寄存器輸出方式。
2.將相關(guān)的組合邏輯放在同一模塊:當(dāng)把相關(guān)的組合邏輯放在同一模塊中后,綜合可以為你的設(shè)計提供更大可優(yōu)化性。因為,在一般默認(rèn)的綜合方法中,綜合工具對模塊的優(yōu)化只是在模塊內(nèi)部進(jìn)行,不會跨越到多個模塊之間。
3.將具有不同設(shè)計目標(biāo)的部分分配到不同模塊中:如將關(guān)鍵邏輯和非關(guān)鍵路徑邏輯被分配到兩個不同的模塊中,這時綜合工具可以專門對關(guān)鍵路徑邏輯進(jìn)行速度優(yōu)化,而對非關(guān)鍵路徑邏輯進(jìn)行面積優(yōu)化。
4.避免使用異步邏輯:(1)設(shè)計中的異步邏輯不僅難以正確實現(xiàn),同時也難一驗證。(2)如果設(shè)計中必須要有異步邏輯電路存在,那么將異步邏輯電路與同步邏輯電路分配到不同的模塊中。
5.合并算術(shù)單元:為了讓綜合工具能夠在資源共享方面進(jìn)行優(yōu)化,就需要所有相關(guān)的共享資源都必須在同一層次結(jié)構(gòu)中,也就是說在同一模塊中。
6.正確劃分模塊,提高綜合速度:隨著綜合工具性能的改善,在劃分模塊時,更重要考慮的方面應(yīng)該是邏輯功能、設(shè)計目標(biāo)、時序的面積需求。將功能相關(guān)的模塊劃分在一起,而不是把它們?nèi)藶榉珠_,加劇模塊之間的時序相關(guān)。
7.避免時序設(shè)計中的例外情況:(1)在設(shè)計中,避免出現(xiàn)多時鐘周期路徑和其它時序例外情況。(2)如果在設(shè)計中必須用到時序例外情況,那么應(yīng)該保證:該例外路徑的起點和終點在芯片級仍然是不變的。(3)在設(shè)計中,避免出現(xiàn)偽路經(jīng)。
8.消除頂層模塊中的膠連邏輯電路:在核的頂層結(jié)構(gòu)中,不要再有實例化的門級邏輯電路出現(xiàn)。
9.芯片劃分:確保設(shè)計的頂層中包含I/OPAD環(huán)和時鐘發(fā)生器電路模塊。
評論