Verilog編碼要求規(guī)范_第1頁
Verilog編碼要求規(guī)范_第2頁
Verilog編碼要求規(guī)范_第3頁
Verilog編碼要求規(guī)范_第4頁
Verilog編碼要求規(guī)范_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實用文案Verilog編碼規(guī)范(僅供內(nèi)部使用)標(biāo)準(zhǔn)文檔擬制:xxx日期:xxx審核:審核者日期:yyyy-mm-dd批準(zhǔn):批準(zhǔn)者日期:yyyy-mm-dd版權(quán)所有侵權(quán)必究修訂記錄修訂日期修訂版本描述修訂者實用文案36標(biāo)準(zhǔn)文檔命名規(guī)范代碼編寫規(guī)范2.1 版面2.2 編寫代碼規(guī)范電路設(shè)計規(guī)則3.1時鐘3.23.33.43.53.63.73.8復(fù)位避免LATCH避免組合反饋賦值語句目錄11261.11.2.26.2728.29.29.case 語句和 if-then-else 語句狀態(tài)機(jī)異步邏輯模塊劃分33293Q.33.提高可移植性的編碼風(fēng)格5.15.25.334采用參數(shù)化設(shè)計34.采用獨立于工具

2、平臺和工藝庫的設(shè)計盡量使用已經(jīng)得到驗證的IP其他一些設(shè)計建議附件參考文檔:36394635實用文案標(biāo)準(zhǔn)文檔基本原則:簡單,致,可O簡單指盡量使用簡單的語句,盡量使用簡單的設(shè)計, 盡量使用簡單的時鐘, 盡量使用簡單的復(fù)位。一致指盡量保持代碼風(fēng)格一致,盡量保持命名一致??芍赜弥赣谐墒斓腎P盡量使用IP,設(shè)計的代碼要盡量可重用。1命名規(guī)范給信號命名就像給孩子取名字一樣,有區(qū)別,有根源,有深度,還有一點,要簡單,別冗長。有區(qū)別指取名字不要一樣,假如大家只有一個手機(jī)號碼,那這個號碼還能有什么用處?有根源指取名字要能象姓氏一樣,讓人一看就直到是張家的后代而不是李家的。有深度就是取名字要有涵義,張一,張二,

3、張三雖然也是名字,但是請考慮一下被取名字人的感受。簡單點,幾十個字母長的名字,打字的和看字的都累。大小寫規(guī)則:只有 Parameter ,'define 和module 名稱才能享受大寫。Module名應(yīng)與文件名保持一致(文件名是小寫),假如不想在設(shè)計后面遇到麻 煩的話。不要嘗試使用任何保留字,因為他們已經(jīng)被保留了。不要重復(fù)使用同樣的名字去命名不同的數(shù)據(jù)。(建議)對 module 名加” _LVx ”的后綴,增強(qiáng) module 名稱的結(jié)構(gòu)層次含義QTRxxxx_LV1CLK_ PROC_LV2 等等;如:設(shè)計頂層為 TOP LEVEL,即LEVEL1,命名為時鐘模塊,IO_PAD,CO

4、RE,為LEVEL2,命名為CORE內(nèi)子模塊為LEVEL3,然后以此類推。對于來自同一驅(qū)動源的所有時鐘信號使用相同的名字。對于低電平有效的信號,應(yīng)該以 _n結(jié)尾。模塊間相連端口名稱要一致。(建議)使用下表所列的命名縮寫方式。全稱名稱clockClkresetrstclearclraddressaddrdata_indindata_outdoutinterrupt requestintread en ablerdenwrite en ablewrencou ntcntrequestreqcontrolctrlarbiterarbp oi nterptrsegme ntsegmemorymem全稱

5、名稱registerreg(建議)使用下列后綴命名方式全稱添加后綴active low_nen able_enselect_selflag_flgdelay_dly? 信號命名的兩個詞之間用下劃線間隔,如ram_addr ,cnt_ctrl等等? 信號命名盡量不要使用孤立的、小寫的英文字母2代碼編寫規(guī)范2.1版面語句獨立成行,增加可讀性和可維護(hù)性。行的長度80個vi這保持每行小于或等于 72個字符。因為有的終端或打印機(jī)每行不能超過字符。規(guī)定72個字符是為了留出邊空,提高可讀性。還有一個原因是為象樣的編輯器留有顯示行號的地方。用回車來分割超過 72個字符的行,并且在下一行用縮進(jìn)來表示該行是前一行

6、的繼續(xù)??s進(jìn)。用縮進(jìn)來提高續(xù)行和嵌套循環(huán)的可讀性??s進(jìn)采用4個空格。避免使用TAB鍵。不同的編輯器或用戶環(huán)境使得TAB的位置差別很大,造成縮進(jìn)的混亂。有一些工具可以將TAB替換成空格。(建議)使用注釋使用注釋來解釋端口、信號、信號組、always塊、函數(shù)等。注釋應(yīng)該放在它所描述的代碼的附近。注釋應(yīng)該簡明扼要,并足夠說明問題。避免注釋雜亂。顯 而易見的功能不用加注釋。注釋關(guān)鍵是說明設(shè)計意圖。2.2編寫代碼規(guī)范在源文件中要有文件頭在源文件、script文件的開始應(yīng)包含一個文件頭。文件頭至少應(yīng)包含下列信息:文件名、作者、模塊的功能描述和關(guān)鍵特征的列表、文件產(chǎn)生的日期、更改記錄(日期、更改者、更改的內(nèi)

7、容)。(參見代碼模板sample.v)模塊名稱用大寫,例如:module MEM_CTRL 。,也可對同一類型的一端口聲明時每行聲明一個端口,并有注釋(最好在同一行) 組端口加注釋。 對于時鐘,復(fù)位以及其他控制信號,需要注釋有效工作沿或者有 效工作值建議用下述順序聲明端口。/INPUTSclocks/ po sedge activeresets/ active highen ables ,/ active highother con trol sig nals ,Data and address lines ,/OUT PUTSclocksresetsen ablesother con tro

8、l sig nals , data在輸入和輸出兩類端口之間留一個空行來提高可讀性。如上例所示。端口列表之后,使用 P arameter 定義內(nèi)部信號寬度以及其他參數(shù)化設(shè)置。10信號申明和內(nèi)部信號申明要單獨成行,參考samp le.v 文件使用簡單的語句, 一般使用ifelse和case就能滿足大部分需求,不要使用復(fù)雜的語句常量(1 )一位的控制信號采用二進(jìn)制表達(dá)方式,如1'b0 ;(2)常數(shù)位寬不可缺省;如:Bad :if (rst_n = 0) && (cnt_addr = 15)Good : if (rst_n = 1'bO) && (cnt

9、_addr = 5'd15)? 變量(1) Net and Register(a) 一位位寬的wire信號的聲明不可缺省(b) 一個reg變量只可以在一個 always語句中賦值(C)(建議)任一 register的賦值加上單位延遲,對異步復(fù)位同樣加上單位延遲;(d )向量有效位順序的定義采用倒序格式,如:Data4:0(2) Memory代碼中不建議使用 Memory(存儲器陣列),Memory 只用于Testbench中,訪問存儲器陣列中某一向量的某一位或幾位,需要通過中間變量進(jìn)行。例:reg15:0mem0:255;temp = mem33;/temp gets data at

10、addr 333_bit_reg = temp 8:6;/get three bits of addr 33運算符及表達(dá)式(1)表達(dá)式(a)用括號來表示執(zhí)行的優(yōu)先級,盡管操作符本身有優(yōu)先順序,但用括號表示優(yōu)先級對讀者更清晰,更有意義如:Bad:A + B ? C : D;Good:(A + B) ? C : D;(b) 適當(dāng)使用括號適當(dāng)使用括號可以控制生成的電路結(jié)構(gòu),如Z = A+B + C+D ,綜合結(jié)果可能為三級加法器,而變換為Z = (A + B) + (C + D),綜合結(jié)果則可能為兩級加法器;(C )注意資源共享需要資源共享的部分一定要放在同一個模塊的同一個always 語句中,不同

11、模塊不同always語句之間的代碼不能實現(xiàn)資源共享。如:always (.)if (.) d0 = A + B;else d0 = C + D;中,DC可能只會生成一個加法器。條件算子中不存在資源共享如:z = (cond = 1 ' b1)?(a+b) : (c+d);必須使用兩個加法器;而等效的條件if-else語句可以資源共享,如:if (cond=1' b1)z = (a+b);elsez = (c+d);只要加法器的輸入端復(fù)用,就可以實現(xiàn)加法器的共享,使用一個加法器實現(xiàn)。(d )盡量采用公共子表達(dá)式x=a+b+cy=d+a+b改為:z=a+bx=z+c y=d+z(2

12、)算符(a)條件運算符r1 = gate? r2 : r3;避免使用條件嵌套:r1 = (aa = 0)? (bb = 0)? r2 : r3) : r4; or r1 = aa,bb = 0? r2:aa,bb = 0? r3:aa,bb = 0? R4:r4;(b)邏輯操作符在if(),while(),()?A:B之類的表達(dá)式中,括號中的表達(dá)式應(yīng)該是一個邏輯表達(dá)式,相應(yīng)的操作符應(yīng)該用邏輯操作符。如:wirex,A,B;(x) ? A:B與 (x = 1'b1) ? A:B與 if(A&&B)=1' b1)While(A=B)與 while(A=B)操作結(jié)果相

13、同,但顯然前者不規(guī)范。(c) 乘法運算符“ *”對于一個變量 data與常數(shù)constant 相乘data * constant,如果常數(shù)不是2的整數(shù)次幕,建議先將其分解,如constant= 53 = 32 + 16 + 4 + 1 =2人5 + 2人4 + 22 + 2人0,這樣乘積就可以表示為變量data移位結(jié)果的相加。對于乘法運算符“ * ”,綜合后通常得到的是乘法器,時延較大。? 賦值語句(1 )不要在信號列表中進(jìn)行運算操作如:Bad:addr(a,b,d &e);Good:addr(a,b,c);c=d &e;(2)BLOCK賦值和NON-BLOCK 賦值的使用(a

14、)組合邏輯采用 BLOCK賦值(=)如:always (dat)i_dat = dat;(b)非組合邏輯(主要是寄存器)采用 NON-BLOCK 賦值并加delay以保證前仿真和后仿真的一致如:always (po sedeg clk)q <= #'DEL d;(3)在同一塊語句中不允許同時出現(xiàn)阻塞賦值和非阻塞賦值? 條件語句(1)IF語句(a)向量比較時,比較的向量長度要相等,同樣向量和常量比較時長度也要求匹配,長度不同時要求進(jìn)行顯式位擴(kuò)展( verilog對位數(shù)小的向量做0擴(kuò)展以使它們的長度相匹配,該擴(kuò)展是隱式的)如:reg7:0abc;reg3:0def;if (abc =

15、 4'b0,def) beginif (abc =8'h0) begin(b)不要采用if表達(dá)式的簡寫形式例如:if (variable) 等同于 if (variable != 0)if (Variable)等同于 if (variable = 0)但后者才合乎規(guī)范(C)每個if都應(yīng)該有一個else與之相對應(yīng),如果條件為假時不進(jìn)行任何操作,則用一條空語句 else ;避免產(chǎn)生latch(d)if.else if.else if.else的代碼書寫格式如下,要注意優(yōu)先級if (.)beginendelsebeginif (.)else (.)ifelse (.)end(d)如果

16、變量在if-else語句中非完全賦值,則應(yīng)給變量一個缺省值如:if (a = b)beginendv1 = 2'b01;v2 = 2'b10;/v3 is not assig nedelse if (a = c)beginv2 = 2'b10;v3 = 2'b11;/v1 is not assig nedendelse/default賦值beginv1=2'b00;v2 = 2'b00;v3 = 2'b00;end(2)CASE語句語句,避免產(chǎn)生Latch(a)所有的case語句都應(yīng)該有一個default綜合工具不支持(b)(建議)不要使

17、用 casex、casez語句,循環(huán)語句(1)forever 語句(2) rep eat 語句(3) while 語句(4) for語句在可以用其它語句描述電路時,建議不要采用循環(huán)語句來描述。ini tial語句不要在RTL代碼中出現(xiàn)initial塊綜合會將initial塊忽略,使前仿真和后仿真不一致in itialbeginend always 語句(1)在使用always生成組合邏輯時,敏感表要列全,敏感表中也不能包含沒有用到的變量。Rule:Comb in ati onal sen sitivity lists should in clude1)A ny sig nal on right

18、 hand side of assig nment2)A ny sig nal in if or case exp ressi onFor exa mple:module sen se_list_ex(b,c,);P ARAMETER/INPUTSinputb;inputc;inputd;/OUT PUTS/INOUTS/SIGNAL DECLARATIONSwireb;wirec;wired;rega;/ASSIGN STATEMENTS/MAIN CODEalways (b or c or d)if (b = 1 ' b1)a = c & d;elseif (c=1'

19、; b1) a = d;en dmoduleSENSE_LIST_EX(2 )對帶異步清零端的寄存器的定義模板always (po sedge clk_ma in or n egedge rst_n)if( rst_n = 1'bO )/此處統(tǒng)一采用rst_n = 1'bO形式而不采用(! rst_n )begi n/形式,對相關(guān)寄存器清0 (采用# 'u_dly<= 賦值)endelsebegi n/對相關(guān)寄存器賦值(采用# 'u_dly<= 賦值)end采用時鐘上升沿觸發(fā)。? 有限狀態(tài)機(jī)(FSM )(1)組合邏輯和時序邏輯分開描述;/ P ART

20、 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full _n ew_fr or full or have_s pace)begi n: OVC_FSM_NXT_STcase (cur_state)STDBY:begi nif (full_ new_fr = 1'b1)nxt_state = W_BLOCK;else if (full = 1'b1)nxt_state = W_DSCD;elsenxt_state = cur_state;endW BLOCK:beginif (have_s pace = 1&

21、#39;b1)nxt_state = STDBY;elsenxt_state = cur_state;endW DSCD:beginif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_;ST/ P ART 2: SEQUENTIAL LOGIC FOR CURRENT STATEalways (po sedge clk or 'RST_EDGE reset)begi n: OVC_FSM_ST_

22、TRANSif(reset = 'RST_VALUE)cur_state <= 'DLY W_BLOCK;elsecur_state <= 'DLY n xt_state;end / OVC_FSM_ST_TRANS3電路設(shè)計規(guī)則3.1時鐘(建議)簡單的時鐘結(jié)構(gòu)易于理解、分析和維護(hù),而且容易產(chǎn)生好的綜合結(jié)果。最好是能夠有單一的全局時鐘,所有寄存器都在上升沿觸發(fā)。所有子模塊內(nèi)部使用單一時鐘單一時鐘沿,如條件不滿足時,必須注明原因,并 提出對綜合以及布線的要求。設(shè)計中包含內(nèi)部產(chǎn)生的時鐘時,必須將所有需要的時鐘在一個單獨的模塊中生成。如果不得不用混合的時鐘沿,在綜

23、合和時序分析時確保能滿足時鐘精度最差情況下的占空比。同時確保把假定的占空比寫入用戶手冊。在多數(shù)設(shè)計中,占空比是時鐘樹的函數(shù),而時鐘樹的插入通常又依賴于具體的工藝。使用Core的芯片設(shè)計者必須檢查實際的占空比能夠滿足Core的要求,也應(yīng)該了解怎樣改變綜合和時序分析的策略以使得Core能夠滿足實際的條件。(建議)多數(shù)基于掃描鏈的測試方法要求對上升沿和下降沿觸發(fā)的寄存器分開處理。如果必須使用大量的上升沿和下降沿觸發(fā)的寄存器,將上升沿和下降沿觸發(fā) 的寄存器分到不同的模塊中是很有用的。這樣容易確定下降沿觸發(fā)的寄存器,并 可將它們放到不同的掃描鏈中。(建議)避免在RTL級手工實例化時鐘 Buffer 。時

24、鐘Buffer通常是在綜合以后在物理設(shè)計時插入的。在可綜合的RTL代碼中,時鐘網(wǎng)絡(luò)通常被認(rèn)為是理想的網(wǎng)絡(luò),沒有延時。在布局布線時,時鐘樹插入工具 插入適當(dāng)?shù)慕Y(jié)構(gòu),盡可能的接近理想的、平衡的時鐘配布網(wǎng)絡(luò)。Buffer,用于指明一個例外情況是在頂層模塊中可以插入廠家提供的偽時鐘時鐘樹的源頭和時鐘樹的參數(shù)。(建議)避免在 RTL級使用門控時鐘或內(nèi)部產(chǎn)生的時鐘信號。門控時鐘電路依賴于具體的工藝和時序。門控時鐘不正確的時序可能導(dǎo)致假的violati on )。時鐘信號和誤操作。不同局部時鐘SKEW還會導(dǎo)致保持時間沖突(門控時鐘還會降低電路的可測性,也使得綜合的約束變得困難。多數(shù)低功耗的電路需要門控時鐘,

25、但它們不應(yīng)該出現(xiàn)在RTL級的編碼中,象P ower Comp iler這類工具可以自動去做。應(yīng)該讓產(chǎn)生這些如果設(shè)計中必須使用門控時鐘、內(nèi)部產(chǎn)生的時鐘或復(fù)位信號,信號的電路位于設(shè)計頂層的一個獨立的模塊中。它將違反編碼規(guī)范的地方限制在 一個小的范圍內(nèi),有利于對這些產(chǎn)生電路開發(fā)特殊的測試策略。對于其他模塊將 可采用標(biāo)準(zhǔn)的時序分析和掃描鏈插入技術(shù)。3.2復(fù)位(建議)確保所有寄存器只被簡單的復(fù)位信號所控制。最好的情況是,復(fù)位信號是1bit寄存器的輸出。因為組合邏輯的輸出會帶有毛刺,對于異步復(fù)位電路,則會引起觸發(fā)器的異常。(建議)盡可能避免內(nèi)部產(chǎn)生的條件復(fù)位信號。通常模塊內(nèi)所有寄存器應(yīng)在同一時間內(nèi)被復(fù)位。

26、這種方式使得分析和設(shè)計更加簡單和容易。(建議)如果需要條件復(fù)位,設(shè)置一個單獨的復(fù)位信號,并且將產(chǎn)生邏輯隔離于一個單獨的模塊。這種方式可使代碼更易讀,并易于綜合出好的結(jié)果。如果需要內(nèi)部產(chǎn)生異步復(fù)位信號,必須保證所產(chǎn)生的異步復(fù)位信號沒有毛刺,最好的辦法是保證異步復(fù)位信號最后為1bit觸發(fā)器的輸出,例如當(dāng)計數(shù)器達(dá)到一個預(yù)設(shè)值時,產(chǎn)生異步復(fù)位信號:bad :wire reset; assign reset = (count=value);better:reg reset;always (po sedge elk)reset <= (co un t=value);3.3 避免 LATCH描述組合邏

27、輯的 always塊中,如果if語句缺乏else子句、case語句中各個條件所處理的變量不同都會在綜合時推斷出LATCH。使用下述方法可避免LATCH:對所有的輸入條件都給出輸出。保證always塊敏感列表完備。敏感列表應(yīng)包括:if(),ease()中的條件信號;所有 always塊中位于賦值語句右邊的信號;當(dāng)信號為多bit向量時,應(yīng)包括向量的所有bit而不是部分。在最終優(yōu)先級的分支上使用else子句,而不用elsif 。所有的Case 應(yīng)該有一個 default case 。避免使用LATCH,除非能清楚地分析相關(guān)電路的時序以及毛刺帶來的影響3.4避免組合反饋在設(shè)計中避免組合反饋電路。這種電

28、路違背了同步設(shè)計原則,難以控制其行為,對仿真、調(diào)試和DFT都極其不利。3.5賦值語句在寫可綜合的代碼時,在時序邏輯的always語句塊中總是使用非阻塞賦值。否則RTL級的仿真會和門級仿真的結(jié)果不一致。在組合邏輯的always語句塊中使用阻塞賦值。同一個觸發(fā)器不能在多個always塊中被賦值。3.6case語句禾n if-else 語句(建議)如果不需要有優(yōu)先級的編碼結(jié)構(gòu),建議使用case語句而不要使用if-else語句。對于基于cycle的仿真器,case語句的仿真速度要比if語句的仿真速度快。對于大的多選器,case語句也比條件賦值語句的仿真速度快。對于綜合工具,case語句也往往能產(chǎn)生出時

29、序和面積更優(yōu)化的電路。(建議)對于條件分支為獨熱編碼的case語句,建議采用下列語句, 對于綜合工具能產(chǎn)生較優(yōu)化的電路case(1 ' b1)con diti on1 : stateme nt ;con diti on2 : stateme nt ;default : stateme nt;endcase3.7狀態(tài)機(jī)將狀態(tài)機(jī)的描述分成兩個always 塊,一個用來描述組合邏輯,一個用來描述時序邏輯。(建議)用參數(shù)語句來定義狀態(tài)向量。(建議)將狀態(tài)機(jī)的邏輯和非狀態(tài)機(jī)的邏輯分成不同的模塊,以便于綜合工具對狀態(tài)機(jī)進(jìn)行單獨優(yōu)化。必須使用default 條件為狀態(tài)機(jī)指定一個默認(rèn)的狀態(tài) ,防止?fàn)顟B(tài)

30、機(jī)進(jìn)入死鎖狀態(tài)。FSM提供防死鎖機(jī)制,以防止限死在某個狀態(tài),特別是在異常情況下。在FSM邏輯比較復(fù)雜的時候,建議使用獨熱編碼方式,以提高時序。/ P ART 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full_ new_fr or full or have_s pace)begi n: OVC_FSM_NXT_STcase (cur_state)STDBY:begi nif (full_ new_fr = 1'b1)nxt_state = W_BLOCK;else if (full = 1'b1)nxt_

31、state = W_DSCD;elsenxt_state = cur_state;endW BLOCK:begi nif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = cur_state;endW DSCD:begi nif (have_s pace = 1'b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_;ST/ P ART 2: SEQUENTIAL LOGIC F

32、OR CURRENT STATEalways (po sedge elk or 'RST_EDGE reset)begi n: OVC_FSM_ST_TRANSif(reset = 'RST_VALUE)cur_state <= 'DLY W_BLOCK;elsecur_state <= 'DLY n xt_state;end / OVC_FSM_ST_TRANS? 狀態(tài)機(jī)輸出異步控制信號時,必須采用下列結(jié)構(gòu)3.8異步邏輯(建議)避免使用異步邏輯。異步邏輯難于設(shè)計和驗證,并會降低設(shè)計的可移植性。(建議)如果在設(shè)計中使用異步邏輯,將異步邏輯和同步邏輯分

33、成不同的模塊。這使得代碼檢查更加容易(異步邏輯通常需要仔細(xì)的檢查和功能及時序上的驗 證)。異步信號必須使用兩級觸發(fā)器同步之后使用。如下圖所示clk14模塊劃分(建議)對設(shè)計層次中的每一個模塊,鎖存模塊的所有輸出信號。這樣做可以簡化處理過程, 它使得輸出的驅(qū)動強(qiáng)度和輸入延時都可預(yù)期。輸出驅(qū)動強(qiáng)度是觸發(fā)器的平均驅(qū)動強(qiáng)度。(建議)保持相關(guān)的組合邏輯在同一個模塊中。這有利于綜合工具對邏輯的優(yōu)化,也有利于時序預(yù)算和快速仿真。(建議)對不同設(shè)計目標(biāo)的電路分成不同的模塊以便綜合工具對將含有關(guān)鍵路徑的邏輯和非關(guān)鍵路徑的邏輯分成不同的模塊,關(guān)鍵路徑采用速度優(yōu)化,對非關(guān)鍵路徑采用面積優(yōu)化。(建議)確保只有在頂層模

34、塊中才包括I/O PAD。頂層模塊中還包括一個中層模塊,該模塊中包含 JTAG模塊、時鐘產(chǎn)生電路、CORE邏輯。這個要求不是強(qiáng)制性的,但這樣做易于集成測試邏輯、PAD和功能邏輯。(建議)避免在頂層模塊中出現(xiàn)Glue logic 。5提高可移植性的編碼風(fēng)格5.1采用參數(shù)化設(shè)計(建議)不要直接使用數(shù)字在設(shè)計中不要直接使用數(shù)字(Hard-Coded Numeric Value )。 作為例外,可以使用0和1 (但不要組合使用,如1001 )。例如:差的編碼風(fēng)格:wire 7:0my_in _bus;reg7:0my_out_bus;好的編碼風(fēng)格:'Define MY BUSSIZE 8wir

35、e MY_BUS_SIZE-1:0my_in _bus;regMY_BUS_SIZE-1:0my_out_bus;另一種較好的編碼風(fēng)格,有利于IP封裝:P arameter BUS_SIZE = 8 ;wire BUS_SIZE-1:0my_in _bus ;regBUS_SIZE-1:0my_out_bus(建議)將一個設(shè)計的所有的'defi ne 語句集中到一個單獨的文件。5.2采用獨立于工具平臺和工藝庫的設(shè)計(建議)避免嵌入式的 EDA工具的命令。不要在源代碼中使用嵌入式的EDA工具命令。因為其他的EDA工具并不一定認(rèn)得這些隱含的命令,導(dǎo)致差的或錯誤的結(jié)果,降低代碼的可移植性。即

36、使是使用Design Compiler,當(dāng)綜合策略改變是,嵌在源代碼中的綜合命令也不如單獨 的script文件中的綜合命令容易修改。aI ”reset例如:1:/synop sys asyn c_set_reset2:always (po sedge clk or po sedge reset)諸如第一行之類的工具命令最好不要使用。這個規(guī)則有一個例外就是編譯開關(guān)的打開和關(guān)閉可以嵌入到代碼中。例如:/synop sys tran slate_off/synop sys tran slate_ on(建議)使用獨立于工藝的庫。(建議)在設(shè)計中避免實例化(in sta ntiate )門,門級設(shè)計難

37、于理解、維護(hù)和重用。如果使用的特定工藝的門,設(shè)計將變得不可移植。如果必須使用特定工藝的 門,建議將它們放于單獨得模塊,這樣在移植時易于更改。5.3盡量使用已經(jīng)得到驗證的IP(1 )對于通用的接口和常用的模塊,盡量使用已經(jīng)得到驗證的IP(2)盡量對自己設(shè)計的模塊采用參數(shù)化設(shè)計,在得到充分驗證之后,能被其他項目當(dāng)作IP使用,提高其他設(shè)計的可靠性,縮短設(shè)計周期。bad:module add (a,b,c);inp ut 7:0 a,b;out put 7:0 c ;better: module add (a,b,c);parameter WIDTH = 8 ;inp ut WIDTH-1:0 a,b

38、 ;out put WIDTH-1:0 c;6其他一些設(shè)計建議整個項目組都使用一致的信號命名規(guī)則。盡量避免使用復(fù)雜的運算符,如*, /, %。特別是/, %,大部分綜合器的支持是非常有限的(只支持常量)。提供方便調(diào)試的功能:比如增加可讀的標(biāo)志寄存器、統(tǒng)計計數(shù)、FIFO的狀態(tài)寄存器等等。在地址空間允許的范圍內(nèi),盡量使內(nèi)部關(guān)鍵觸發(fā)器能夠通過CPU接口被CPU訪問和控制,如計數(shù)器,移位寄存器,狀態(tài)機(jī)寄存器等等Bad:reg7:0 ent ;Always (po sedge elk or p osedge rst)If (rst=1' b1)ent <= 0 ;Else if (cnt_

39、en=1' b1)ent <= ent +_1 ;better: reg7:0 ent;always (po sedge elk or p osedge rst)if (rst=1' b1)ent <= 0 ;else if (cnt_en | test_e nt_en)ent <= ent + 1 ;盡量避免使用異步 FIFO ,采用將速度較慢側(cè)的讀或者寫使能信號同步到速度較快側(cè),然后使用同步 FIFO實現(xiàn)。對于FPGA設(shè)計,適當(dāng)限制組合邏輯的輸入信號數(shù)目(4個以下最好)。在一個logie bloek 中fan-in 數(shù)目是固定的;組合邏輯如果需要跨越Log

40、ie bloek ,則延遲會大大增加。這對提高Timi ng 很有用。對于FPGA設(shè)計,一般情況先使用塊RAM,在塊RAM 資源不夠的情況下才使用分散RAM ,而且分散RAM的接口時序最好與塊 RAM的時序一致,便于隨時調(diào)整RAM的使用狀況。邏輯級數(shù)過多的功能塊,使用寄存器隔離,提高設(shè)計的綜合時的時鐘頻率。不要使用位寬過大的計數(shù)器,建議將位寬超過8的計數(shù)器打散成多個不超過8bit寬度的計數(shù)器。計數(shù)器要求可被 CPU直接訪問,并且每個打散后的小計數(shù)器都有CPU可控的計數(shù)使能信號。Bad:reg31:0 ent ;Always (po sedge elk or p osedge rst)If (r

41、st=1' b1)ent <= 0 ;Else if (cnt_en=1' b1)better:ent <= ent +_1 ;reg7:0 cnt0,cnt1,cnt2,cnt3;wire cn t0_e n,cn t1_e n,cn t2_e n,cn t3_e n ;assig n cn t0_e n = cnt_en | test_c nt_en ;assig n cn t1_e n = (&cnt0 & cnt_en) | test_c nt_en;always (po sedge elk or p osedge rst)if (rst=1

42、' b1)cntO <= 0 ;else if (cnt0_en=1' b1)cntO <= cnt0 + 1 ;盡可能地使用 FPGA工具能提供的 Cores。例如ALTERA/Xilinx的FPGA內(nèi)嵌LUT的DSP可以用于實現(xiàn)比較復(fù)雜的數(shù)學(xué)計算公式、算法,而且不占用原有的 資源。養(yǎng)成良好的習(xí)慣:每個模塊代碼完成之后單獨綜合,或者幾個子模塊合成一個功能相對完整的模塊時綜合一次,把相應(yīng)的warnning或者latch去掉,不能去除 的warning 需要全部加以說明,并以文檔方式記錄。7附件1. Verilog 編碼文檔模板:samp le.v*/ CompanyUTStarcom/Cop yright(c) 2003, UTStarcom Telecom Co., Ltd.All rights reserved/ P roject Name :/ File namexxx.v/ Desig neryour n ame

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論