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