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