新聞中心

HDL設(shè)計(jì)探究

作者: 時(shí)間:2008-02-05 來源: 收藏


一.可移植性編碼

本文引用地址:http://2s4d.com/article/78709.htm

1.只使用IEEE標(biāo)準(zhǔn)類型(VHDL):(1)使用STD_LOGIC類型,而不是STD_ULOGIC類型;(2)設(shè)計(jì)中不要?jiǎng)?chuàng)建過多的的子類型;(3)不要使用BIT和BIT_VECTOR類型。

2.不使用立即數(shù):在設(shè)計(jì)中,不要使用立即數(shù)(但作為例外,可使用0和1),推薦使用常量。使用常量有以下優(yōu)點(diǎn):(1)常量對(duì)于一個(gè)設(shè)計(jì)具有更多的靈活性;(2)常量值只需要在一個(gè)地方修改;(3)編譯器可能只支持常量類型,不支持立即數(shù)。

3.對(duì)于VHDL程序,把常數(shù)和參數(shù)定義在由1個(gè)或多個(gè)文件組成的程序包中。

4. 對(duì)于Verilog程序,把常數(shù)和參數(shù)定義在1個(gè)或多個(gè)小文件中。例如,文件名稱為DesignName_Constant.V或DesignName_Parameters.v。

5.避免在代碼中嵌入綜合命令。

6.使用工藝無關(guān)庫:(1)對(duì)于算法元件,使用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信號(hào)設(shè)計(jì)指南

1.避免使用混合時(shí)鐘沿:(1)在你的設(shè)計(jì)中,要避免同時(shí)使用上升沿觸發(fā)和下降沿觸發(fā)這兩種觸發(fā)方式的寄存器。若設(shè)計(jì)中必須同時(shí)使用上升沿和下降沿進(jìn)行觸發(fā),則必須確保綜合和時(shí)序分析后的該模塊的時(shí)序周期在最壞狀態(tài)下也是正確的,必須在給用戶的文檔中詳細(xì)描述對(duì)該設(shè)計(jì)中時(shí)序信號(hào)占空比的要求;(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)致可測(cè)性限制。

5.門控時(shí)鐘和低功耗設(shè)計(jì):(1)如果必須使用門控時(shí)鐘或內(nèi)部時(shí)鐘,或者RESET信號(hào),就應(yīng)該把內(nèi)部時(shí)鐘電路或RESET電路分離出來,將它們作為頂層下的獨(dú)立模塊進(jìn)行設(shè)計(jì)。將設(shè)計(jì)細(xì)分。保證所有單一模塊,只使用一個(gè)時(shí)鐘和一個(gè)RESET信號(hào)。(2)如果你的設(shè)計(jì)中需要門控時(shí)鐘,那么就要在RTL代碼中使用同步加載寄存器。

6.避免在模塊內(nèi)部產(chǎn)生RESET信號(hào):(1)如果可能,盡量避免在模塊內(nèi)部產(chǎn)生RESET信號(hào),或者避免用其它條件邏輯產(chǎn)生RESET信號(hào);(2)如果確實(shí)需要條件RESET信號(hào),那么可以創(chuàng)建一個(gè)獨(dú)立的RESET信號(hào),再創(chuàng)建一個(gè)獨(dú)立的條件RESET產(chǎn)生邏輯模塊。

7.RESET邏輯功能:RESET信號(hào)的邏輯功能應(yīng)該是直接清除所有的寄存器。不要把RESET信號(hào)作為狀態(tài)機(jī)的輸入。

8.一位同步器:使用兩級(jí)觸發(fā),在兩個(gè)時(shí)鐘域之間傳遞一位數(shù)據(jù)。如圖  所示。把這些觸發(fā)器用不同名字區(qū)別開,這樣有利于集成時(shí)對(duì)這些亞穩(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程序中,對(duì)所有可能的輸入條件,都有明確的輸出;在VHDL程序中,對(duì)于條件語句的最后一個(gè)分支,使用ELSE語句(而不時(shí)使用ELSIF語句)。

3.如果必須使用鎖存器:可使用多選的方法,提供一般功能或I/O借口的數(shù)據(jù)。多選器的選擇控制位來自于掃描控制使能的測(cè)試模式管腳。

4.避免產(chǎn)生組合邏輯電路反饋:組合電路反饋是指組合邏輯電路形式的反饋環(huán)路。組合反饋環(huán)路會(huì)引起一系列問題,包括會(huì)使精確靜態(tài)時(shí)序分析難以實(shí)現(xiàn)。

5.完整的敏感信號(hào)列表:(1)規(guī)則:每個(gè)process(VHDL)和always(Verilog)模塊中的敏感信號(hào)列表必須完整。(2)對(duì)于組合邏輯模塊(模塊中不包括寄存器或鎖存器),敏感信號(hào)列表必須包括過程中用到的每個(gè)信號(hào),也就是出現(xiàn)在賦值語句右側(cè)的信號(hào)或條件表達(dá)式中用到的信號(hào),都應(yīng)該列在敏感信號(hào)列表中。(3)對(duì)于時(shí)序邏輯模塊,敏感信號(hào)列表必須包括過程中用到的時(shí)鐘信號(hào)。如果時(shí)序過程模塊還要用到異步RESET信號(hào),那么敏感信號(hào)列表中還應(yīng)該包括RESET信號(hào)。(4)確保過程模塊敏感信號(hào)列表中的信號(hào)是必需的。敏感信號(hào)列表中沒必要出現(xiàn)的信號(hào)會(huì)降低仿真速度。

6.阻塞和非阻塞賦值(Verilog):在書寫Verilog可綜合代碼時(shí),在always@(posedge clk)模塊中,總是使用非阻塞賦值方式,否則會(huì)產(chǎn)生RTL級(jí)仿真和門級(jí)仿真功能不一樣的現(xiàn)象。

7.信號(hào)和變量賦值(VHDL):在書寫VHDL可綜合代碼時(shí),建議使用信號(hào)量,而不時(shí)使用變量,以確保綜合前的仿真與綜合后的仿真相一致。如果你覺得使用了變量后,仿真速度得到了非常顯著的提高,那么也可以使用變量。

8.CASE語句和IF-THEN-ELSE語句:(1)VHDL語言和Verilog語言中的CASE語句對(duì)應(yīng)一個(gè)單級(jí)的多選電路,IF-THEN-ELSE語句對(duì)應(yīng)于一個(gè)優(yōu)先編碼的多級(jí)組合選擇電路。(2)多選器是一個(gè)相對(duì)更快的電路,因此,在不需要使用優(yōu)先級(jí)編碼結(jié)構(gòu)時(shí),推薦使用CASE語句,而不要使用IF-THEN-ELSE語句進(jìn)行描述。如果你有一個(gè)遲到的信號(hào)時(shí),使用IF-THEN-ELSE語句可能會(huì)有用。

9.時(shí)序邏輯電路的HDL語言描述:(1)包括像狀態(tài)機(jī)這樣的時(shí)序邏輯,都可以用一個(gè)時(shí)序過程進(jìn)行描述。為了提高程序的可讀性,應(yīng)該把一些對(duì)中間變量賦值的語句移到時(shí)序邏輯描述的過程之外。(2)在VHDL語言中,把各狀態(tài)變量定義為類型。在Verilog語言中,用DEFINE命令定義各狀態(tài)變量。(3)隊(duì)員包含F(xiàn)SM(有限狀態(tài)機(jī))和非FSM邏輯的模塊,在綜合時(shí)有不同的要求,應(yīng)該把它們單獨(dú)放在不同的模塊中。

10.對(duì)關(guān)鍵信號(hào)的描述:讓后到達(dá)信號(hào)盡量靠近模塊的輸出端口。例如,在IF-THEN-ELSE模塊中,讓后到達(dá)信號(hào)具有較高優(yōu)先級(jí)。

11.避免使用延遲語句:在RTL編碼中,不要使用任何延遲語句。

12.避免使用FULL_CASE和PARALLEL_CASE結(jié)構(gòu)編程:以VHDL語句中的CASE語句的使用方法書寫VERILOG語言中的CASE語句結(jié)構(gòu)。

 四. 可綜合劃分

好的可綜合劃分會(huì)給你帶來許多優(yōu)勢(shì),它包括:(1)更好的綜合結(jié)果;(2)更少的編程運(yùn)行時(shí)間;(3)只要使用更簡(jiǎn)單的綜合策略就可以滿足設(shè)計(jì)的時(shí)序要求。

1.所有輸出采用寄存器輸出:對(duì)于采用層次化結(jié)構(gòu)的核設(shè)計(jì),子模塊中所有的輸出信號(hào)都應(yīng)該使用寄存器輸出方式。

2.將相關(guān)的組合邏輯放在同一模塊:當(dāng)把相關(guān)的組合邏輯放在同一模塊中后,綜合可以為你的設(shè)計(jì)提供更大可優(yōu)化性。因?yàn)?,在一般默認(rèn)的綜合方法中,綜合工具對(duì)模塊的優(yōu)化只是在模塊內(nèi)部進(jìn)行,不會(huì)跨越到多個(gè)模塊之間。

3.將具有不同設(shè)計(jì)目標(biāo)的部分分配到不同模塊中:如將關(guān)鍵邏輯和非關(guān)鍵路徑邏輯被分配到兩個(gè)不同的模塊中,這時(shí)綜合工具可以專門對(duì)關(guān)鍵路徑邏輯進(jìn)行速度優(yōu)化,而對(duì)非關(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)在芯片級(jí)仍然是不變的。(3)在設(shè)計(jì)中,避免出現(xiàn)偽路經(jīng)。

8.消除頂層模塊中的膠連邏輯電路:在核的頂層結(jié)構(gòu)中,不要再有實(shí)例化的門級(jí)邏輯電路出現(xiàn)。

9.芯片劃分:確保設(shè)計(jì)的頂層中包含I/OPAD環(huán)和時(shí)鐘發(fā)生器電路模塊。
 



關(guān)鍵詞: HDL 設(shè)計(jì) 可編程

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉