下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Verilog編碼規(guī)范(僅供內(nèi)部使用)擬制:xxx日期:XXX審核:審核者日期: yyyy-mm-dd批準(zhǔn):批準(zhǔn)者日期: yyyy-mm-dd版權(quán)所有侵權(quán)必究修訂記錄修訂日期修訂版本描述修訂者目錄1 命名規(guī)范2 代碼編寫規(guī)范2.1 版面102.2 編寫代碼規(guī)范113 電路設(shè)計(jì)規(guī)則510293.1 時(shí)鐘293.2 復(fù)位313.3 避免 LATCH323.4 避免組合反饋333.5 賦值語句333.6 case 語句和 if-then-else 語句333.7 狀態(tài)機(jī)343.8 異步邏輯374模塊劃分385 提高可移植性的編碼風(fēng)格 395.1 采用參數(shù)化設(shè)計(jì)395.2 采用獨(dú)立于工具平臺(tái)和工藝庫的
2、設(shè)計(jì) 405.3 盡量使用已經(jīng)彳#到驗(yàn)證的到416 其他一些設(shè)計(jì)建議 427 458 參考文檔: 54基本原則:簡單,一致,可重用。簡單指盡量使用簡單的語句,盡量使用簡單的設(shè)計(jì),盡量使用簡單的時(shí)鐘,盡量使用簡單的復(fù)位。一致指盡量保持代碼風(fēng)格一致,盡量保持命名一致??芍赜弥赣谐墒斓腎P盡量使用IP,設(shè)計(jì)的代碼要盡量可重用1 命名規(guī)范給信號(hào)命名就像給孩子取名字一樣,有區(qū)別,有根源,有深度,還有一點(diǎn),要簡單,別冗長。有區(qū)別指取名字不要一樣,假如大家只有一個(gè)手機(jī)號(hào)碼,那這個(gè)號(hào)碼還能有什么用處?有根源指取名字要能象姓氏一樣,讓人一看就直到是張家的后代而 不是李家的。有深度就是取名字要有涵義,張一 ,張二
3、,張三雖然也是名字,但是 請考慮一下被取名字人的感受。簡單點(diǎn),幾十個(gè)字母長的名字,打字的和看字的都累。大小寫規(guī)則:只有 parameter , define 和 module名稱才能享受大寫。Module名應(yīng)與文件名保持一致(文件名是小寫),假如不想在設(shè)計(jì)后面遇到麻煩的話。不要嘗試使用任何保留字,因?yàn)樗麄円呀?jīng)被保留了。不要重復(fù)使用同樣的名字去命名不同的數(shù)據(jù)。(建議)對 module名加 _LVx”的后綴,增強(qiáng) module名稱的結(jié)構(gòu)層次含義如:設(shè)計(jì)頂層為 TOP LEVEL即LEVEL1,命名為 QTRxxxx_LV1;時(shí)鐘模塊,IO_PAQ CORE 為 LEVELZ 命名為 CLK_PRO
4、C_LV2等;COR的子模塊為LEVEL3然后以此類推。對于來自同一驅(qū)動(dòng)源的所有時(shí)鐘信號(hào)使用相同的名字。對于低電平有效的信號(hào),應(yīng)該以 _n結(jié)尾。模塊間相連端口名稱要一致。(建議)使用下表所列的命名縮寫方式全稱名稱clockClkresetrstclearclraddressaddrdata_indin全稱名稱data_outdoutinterrupt requestintread enablerdenwrite enablewrencountcntrequestreqcontrolctrlarbiterarbpointerptrsegmentseg全稱名稱memorymemregisterre
5、g(建議)使用下列后綴命名方式全稱添加后綴active low_nenable_enselect_selflag_flgdelay_dly信號(hào)命名的兩個(gè)詞之間用下劃線間隔,如ram_addr, cnt_ctrl信號(hào)命名盡量不要使用孤立的、小寫的英文字母L2.1版面語句獨(dú)立成行,增加可讀性和可維護(hù)性。行的長度保持每行小于或等于 72個(gè)字符。因?yàn)橛械慕K端或打印機(jī)每行 不能超過80個(gè)字符。規(guī)定72個(gè)字符是為了留出邊空,提高可讀 性。還有一個(gè)原因是為象 vi這樣的編輯器留有顯示行號(hào)的地方。用回車來分割超過 72個(gè)字符的行,并且在下一行用縮進(jìn)來表 示該行是前一行的繼續(xù)。縮進(jìn)。用縮進(jìn)來提高續(xù)行和嵌套循環(huán)的
6、可讀性。縮進(jìn)采用4個(gè)空格。避免使用TAB鍵。不同的編輯器或用戶環(huán)境使得 TAB的位置差 別很大,造成縮進(jìn)的混亂。有一些工具可以將TAB替換成空格。(建議)使用注釋使用注釋來解釋端口、信號(hào)、信號(hào)組、always塊、函數(shù)等。注釋應(yīng)該放在它所描述的代碼的附近。注釋應(yīng)該簡明扼要,并足夠說明問題。避免注釋雜亂。顯而易見的功能不用加注釋。注釋關(guān)鍵是說明設(shè)計(jì)意圖。2.2編寫代碼規(guī)范在源文件中要有文件頭在源文件、script文件的開始應(yīng)包含一個(gè)文件頭。 文件頭至少應(yīng)包含下列信息:文件名、作者、模塊的功能描述和關(guān)鍵特征的列表、文件產(chǎn)生的日期、更改記錄(日期、更改者、更改的內(nèi)容) ,(參見代碼模板sample.v
7、 )模塊名稱用大寫,例如:module MEM_CTRL端口聲明時(shí)每行聲明一個(gè)端口,并有注釋(最好在同一行),也可對同一類型的一組端口加注釋。對于時(shí)鐘,復(fù)位以及其他控制信號(hào),需要注釋有效工作沿或者有效工作值建議用下述順序聲明端口。/INPUTSclocks/ posedge activeresets/ active highenables/ active highother control signals ,Data and address lines ,/OUTPUTSclocks,resets,enables ,other control signals ,data在輸入和輸出兩類端口之間
8、留一個(gè)空行來提高可讀性。如上例所 示。端口列表之后,使用 parameter定義內(nèi)部信號(hào)寬度以及其他參數(shù) 化設(shè)置。IO信號(hào)申明和內(nèi)部信號(hào)申明要單獨(dú)成行,參考sample.v文件使用簡單的語句,一般使用ifelse和case就能滿足大部分需求,不要使用復(fù)雜的語句 常量(1) 一位的控制信號(hào)采用二進(jìn)制表達(dá)方式,如 1b0 ;(2)常數(shù)位寬不可缺??;如:Bad: if (rst_n = 0) & (cnt_addr = 15)Good if (rst_n = 1b0) & (cnt_addr = 5d15)變量(1) Net and Register(a) 一位位寬的wire信號(hào)的聲明不可缺省(b)
9、 一個(gè)reg變量只可以在一個(gè) always語句中賦值(c)(建議)任一 register的賦值加上單位延遲,對異步復(fù)位同樣加上單位延遲;(d)向量有效位順序的定義采用倒序格式,如: Data4:0(2) Memory代碼中不建議使用Memory(存儲(chǔ)器陣列),Memory只用于Testbench中,訪問存儲(chǔ)器陣列中某一向量的某一位或幾位,需要通過中間 變量進(jìn)行例:reg15:0mem0:255;temp = mem33;/temp gets data at addr 333_bit_reg = temp8:6; /get three bits of addr 33運(yùn)算符及表達(dá)式(1)表達(dá)式(a
10、)用括號(hào)來表示執(zhí)行的優(yōu)先級(jí),盡管操作符本身有優(yōu)先順序,但用括號(hào)表示優(yōu)先級(jí)對讀者更清晰,更有意義如:Bad:A + B ? C : D;Good:(A + B) ? C : D;(b)適當(dāng)使用括號(hào)適當(dāng)使用括號(hào)可以控制生成的電路結(jié)構(gòu),如 Z = A + B + C +D,綜合結(jié)果可能為三級(jí)加法器,而變換為 Z = (A + B) + (C+ D),綜合結(jié)果則可能為兩級(jí)加法器;(c)注意資源共享需要資源共享的部分一定要放在同一個(gè)模塊的同一個(gè)always語句中,不同模塊不同 always 語句之間的代碼不能實(shí)現(xiàn)資源共享。如: always (.)if (.) d0 = A + B;else d0 =
11、C + D;中,DC可能只會(huì)生成一個(gè)加法器。條件算子中不存在資源共享如:z = (cond = = 1 b1)? (a+b) : (c+d);必須使用兩個(gè)加法器;而等效的條件 if-else 語句可以資源共享,如:if (cond =1 b1)z = (a+b);elsez = (c+d);只要加法器的輸入端復(fù)用,就可以實(shí)現(xiàn)加法器的共享,使用一個(gè)加法器實(shí)現(xiàn)。(d)盡量采用公共子表達(dá)式如:x=a+b+cy=d+a+b改為:z=a+bx=z+cy=d+z(2)算符(a)條件運(yùn)算符r1 = gate? r2 : r3;避免使用條件嵌套:r1 = (aa = 0)? (bb = 0)? r2 : r3
12、) : r4; orr1 = aa,bb = 0? r2:aa,bb = 0? r3:aa,bb = 0? R4:r4;(b)邏輯操作符在if() , while() , ()?A:B之類的表達(dá)式中,括號(hào)中的表達(dá) 式應(yīng)該是一個(gè)邏輯表達(dá)式,相應(yīng)的操作符應(yīng)該用邏輯操作符。如:wire x,A,B;(x) ? A:B與(x = 1b1) ? A:BIf(A&B)與 if(A&B 尸=1 b1)While(A=B) 與 while(A=B)操作結(jié)果相同,但顯然前者不規(guī)范。(c)乘法運(yùn)算符“ *”對于個(gè)變量 data 與常數(shù) constant 相乘 data * constant .如果常數(shù)不是2的整數(shù)
13、次募,建議先將其分解,如constant=53 = 32 + 16 + 4 + 1 = 2A5 + 2A4 + 2A2 + 2A0,這樣乘積就可以表示為變量 data移位結(jié)果的相加。對于乘法運(yùn)算符“*”,綜合后通常得到的是乘法器,時(shí)延較大。賦值語句(1)不要在信號(hào)列表中進(jìn)行運(yùn)算操作如:Bad: addr(a,b,d&e);Good: addr(a,b,c); c=d&e;(2) BLOCKS值和NON-BLOCK值的使用(a)組合邏輯采用BLOCKS值(=)如:always (dat)i_dat = dat;(b)非組合邏輯(主要是寄存器)采用NON-BLOCK值并加delay以保證前仿真和后
14、仿真的一致如:always (posedeg clk)q = #DEL d;(3)在同一塊語句中不允許同時(shí)出現(xiàn)阻塞賦值和非阻塞賦值條件語句(1) IF語句(a)向量比較時(shí),比較的向量長度要相等,同樣向量和常量比較時(shí)長度也要求匹配,長度不同時(shí)要求進(jìn)行顯式位擴(kuò)展(verilog 對位數(shù)小的向量做0擴(kuò)展以使它們的長度相匹配,該擴(kuò)展是隱式的)如:reg7:0abc;reg3:0def;if (abc = 4b0,def) beginif (abc = 8h0) begin(b)不要采用if表達(dá)式的簡寫形式例如:if (variable)等同于if (variable != 0)if (!variabl
15、e)等同于if (variable = 0)但后者才合乎規(guī)范c )每個(gè) if 都應(yīng)該有一個(gè)else 與之相對應(yīng),如果條件為假時(shí)不進(jìn)行任何操作,則用一條空語句 else ;避免產(chǎn)生latchd) if.else if.else if.else的代碼書寫格式如下,要注意優(yōu)先級(jí)if (.)beginendelsebeginif (.) else (.)if (.) else (.)end(d)如果變量在if-else語句中非完全賦值,則應(yīng)給變量一個(gè)缺省值如:if (a = b)beginv1 = 2b01;v2 = 2b10;/v3 is not assignedendelse if (a = c)
16、beginv2 = 2b10;v3 = 2b11;/v1 is not assignedendelse/default 賦值beginv1 = 2b00;v2 = 2b00;v3 = 2b00;endCASE句(a)所有的case語句都應(yīng)該有一個(gè) default語句,避免產(chǎn)生Latch(b)(建議)不要使用casex、casez語句,綜合工具不支持循環(huán)語句(1) forever 語句(2) repeat 語句(3) while 語句(4) for語句在可以用其它語句描述電路時(shí),建議不要采用循環(huán)語句來描述。initial 語句不要在RTL代碼中出現(xiàn)initial 塊綜合會(huì)將initial塊忽略,
17、使前仿真和后仿真不一致initialbeginendalways語句(1)在使用always生成組合邏輯時(shí),敏感表要列全,敏感表中也 不能包含沒有用到的變量。Rule:Combinational sensitivity lists should include1)Any signal on right hand side of assignment2)Any signal in if or case expressionFor example:module sense_list_ex(b, c,);/PARAMETER/INPUTSinputb;inputc;inputd;/OUTPUTS/I
18、NOUTS/SIGNAL DECLARATIONSwireb;wirec;wired;rega;/ASSIGN STATEMENTS/MAIN CODEalways (b or c or d)if (b = = 1 b1)a = c & d;elseif (c=1 b1) a = d;endmodule/SENSE_LIST_EX( 2 )對帶異步清零端的寄存器的定義模板always (posedge clk_main or negedge rst_n)if ( rst_n = 1b0)/ 此處統(tǒng)一采用 rst_n = 1b0形式而不采用( ! rst_n )begin/形式,對相關(guān)寄存器清0
19、 (采用 #u_dly=賦值)endelsebegin/對相關(guān)寄存器賦值(采u_dly=賦值)end采用時(shí)鐘上升沿觸發(fā)。有限狀態(tài)機(jī)(FSM(1)組合邏輯和時(shí)序邏輯分開描述;/ PART 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full_new_fr or full or have_space)begin: OVC_FSM_NXT_STcase (cur_state)STDBY:beginif (full_new_fr = 1b1)nxt_state = W_BLOCK;else if (full = 1b1)nxt_s
20、tate = W_DSCD;elsenxt_state = cur_state;endW_BLOCK:beginif (have_space = 1b1)nxt_state = STDBY;elsenxt_state = cur_state;endW_DSCD:beginif (have_space = 1b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_ST/ PART 2: SEQUENTIAL LOGIC FOR CURRENT STATEa
21、lways (posedge clk or RST_EDGE reset)begin: OVC_FSM_ST_TRANSif(reset = RST_VALUE)cur_state = DLY W_BLOCK;elsecur_state = DLY nxt_state;end / OVC_FSM_ST_TRANS3 電路設(shè)計(jì)規(guī)則3.1 時(shí)鐘(建議)簡單的時(shí)鐘結(jié)構(gòu)易于理解、分析和維護(hù),而且容易產(chǎn)生 好的綜合結(jié)果。最好是能夠有單一的全局時(shí)鐘,所有寄存器都在 上升沿觸發(fā)。所有子模塊內(nèi)部使用單一時(shí)鐘單一時(shí)鐘沿,如條件不滿足時(shí),必 須注明原因,并提出對綜合以及布線的要求。設(shè)計(jì)中包含內(nèi)部產(chǎn)生的時(shí)鐘時(shí),必須
22、將所有需要的時(shí)鐘在一個(gè)單 獨(dú)的模塊中生成。如果不得不用混合的時(shí)鐘沿,在綜合和時(shí)序分析時(shí)確保能滿足時(shí) 鐘精度最差情況下的占空比。同時(shí)確保把假定的占空比寫入用戶 手冊。在多數(shù)設(shè)計(jì)中,占空比是時(shí)鐘樹的函數(shù),而時(shí)鐘樹的插入通常又依賴于具體的工藝。使用 Core的芯片設(shè)計(jì)者必須檢查實(shí)際的占 空比能夠滿足Core的要求,也應(yīng)該了解怎樣改變綜合和時(shí)序分析 的策略以使得Core能夠滿足實(shí)際的條件。(建議)多數(shù)基于掃描鏈的測試方法要求對上升沿和下降沿觸發(fā) 的寄存器分開處理。如果必須使用大量的上升沿和下降沿觸發(fā)的寄存器,將上升沿和下降沿觸發(fā)的寄存器分到不同的模塊中是很有用的。這樣容易確定下降沿觸發(fā)的寄存器,并可將
23、它們放到不 同的掃描鏈中。(建議)避免在RTL級(jí)手工實(shí)伊J化時(shí)鐘 Buffer 。時(shí)鐘Buffer通常是在綜合以后在物理設(shè)計(jì)時(shí)插入的。在可綜合的RTL代碼中,時(shí)鐘網(wǎng)絡(luò)通常被認(rèn)為是理想的網(wǎng)絡(luò),沒有延時(shí)。在布局布線時(shí),時(shí)鐘樹插入工具插入適當(dāng)?shù)慕Y(jié)構(gòu),盡可能的接近理想的、平衡的時(shí)鐘配布網(wǎng)絡(luò)。一個(gè)例外情況是在頂層模塊中可以插入廠家提供的偽時(shí)鐘Buffer ,用于指明時(shí)鐘樹的源頭和時(shí)鐘樹的參數(shù)。(建議)避免在 RTL級(jí)使用門控時(shí)鐘或內(nèi)部產(chǎn)生的時(shí)鐘信號(hào)。門控時(shí)鐘電路依賴于具體的工藝和時(shí)序。 門控時(shí)鐘不正確的時(shí) 序可能導(dǎo)致假的時(shí)鐘信號(hào)和誤操作。不同局部時(shí)鐘 SKEWS會(huì)導(dǎo)致 保持時(shí)間沖突(violation
24、)。門控時(shí)鐘還會(huì)降低電路的可測性,也使得綜合的約束變得困難。多數(shù)低功耗的電路需要門控時(shí)鐘,但它們不應(yīng)該出現(xiàn)在 RTL級(jí)的編碼中,象 Power Compiler這類工具可以自動(dòng)去做。如果設(shè)計(jì)中必須使用門控時(shí)鐘、內(nèi)部產(chǎn)生的時(shí)鐘或復(fù)位信號(hào),應(yīng)該讓產(chǎn)生這些信號(hào)的電路位于設(shè)計(jì)頂層的一個(gè)獨(dú)立的模塊中。它將違反編碼規(guī)范的地方限制在一個(gè)小的范圍內(nèi),有利于對這些 產(chǎn)生電路開發(fā)特殊的測試策略。對于其他模塊將可采用標(biāo)準(zhǔn)的時(shí) 序分析和掃描鏈插入技術(shù)。3.2 復(fù)位(建議)確保所有寄存器只被簡單的復(fù)位信號(hào)所控制。最好的情況是,復(fù)位信號(hào)是 1bit寄存器的輸出。因?yàn)榻M合邏輯的 輸出會(huì)帶有毛刺,對于異步復(fù)位電路,則會(huì)引起觸
25、發(fā)器的異常。(建議)盡可能避免內(nèi)部產(chǎn)生的條件復(fù)位信號(hào)。通常模塊內(nèi)所有 寄存器應(yīng)在同一時(shí)間內(nèi)被復(fù)位。這種方式使得分析和設(shè)計(jì)更加簡 單和容易。(建議)如果需要條件復(fù)位,設(shè)置一個(gè)單獨(dú)的復(fù)位信號(hào),并且將 產(chǎn)生邏輯隔離于一個(gè)單獨(dú)的模塊。這種方式可使代碼更易讀,并 易于綜合出好的結(jié)果。如果需要內(nèi)部產(chǎn)生異步復(fù)位信號(hào),必須保證所產(chǎn)生的異步復(fù)位信號(hào)沒有毛刺,最好的辦法是保證異步復(fù)位信號(hào)最后為1bit觸發(fā)器的輸出,例如當(dāng)計(jì)數(shù)器達(dá)到一個(gè)預(yù)設(shè)值時(shí),產(chǎn)生異步復(fù)位信號(hào):bad: wire reset; assign reset = (count=value);better:reg reset;always (posedg
26、e clk)reset = (count=value);3.3 避免 LATCH描述組合邏輯的always塊中,如果if語句缺乏else子句、case 語句中各個(gè)條件所處理的變量不同都會(huì)在綜合時(shí)推斷出LATCH使用下述方法可避免LATCH:對所有的輸入條件都給出輸出。保證always塊敏感列表完備。敏感列表應(yīng)包括:if(),case()中的條件信號(hào);所有 always 塊中位于賦值語句右邊的信號(hào);當(dāng)信號(hào)為多bit向量時(shí),應(yīng)包括向量的所有bit而不是部分。在最終優(yōu)先級(jí)的分支上使用else子句,而不用elsif。所有的Case應(yīng)該有一個(gè)default case 。避免使用LATCH除非能清楚地分析
27、相關(guān)電路的時(shí)序以及毛刺帶來 的影響3.4 避免組合反饋在設(shè)計(jì)中避免組合反饋電路。這種電路違背了同步設(shè)計(jì)原則,難以控制其行為,對仿真、調(diào)試和DFT都極其不利。3.5 賦值語句在寫可綜合的代碼時(shí), 在時(shí)序邏輯的always語句塊中總是使用非 阻塞賦值。否則 RTL級(jí)的仿真會(huì)和門級(jí)仿真的結(jié)果不一致。在組合邏輯的always語句塊中使用阻塞賦值。同一個(gè)觸發(fā)器不能在多個(gè) always塊中被賦值。3.6 case語句和if-else 語句(建議)如果不需要有優(yōu)先級(jí)的編碼結(jié)構(gòu),建議使用case語句而不要使用if-else 語句。對于基于cycle的仿真器,case語句的仿真速度要比if語句 的仿真速度快。對
28、于大的多選器,case語句也比條件賦值語句的仿真速度快。對于綜合工具,case語句也往往能產(chǎn)生出時(shí)序和面積更優(yōu)化的 電路。(建議)對于條件分支為獨(dú)熱編碼的case語句,建議采用下列語句,對于綜合工具能產(chǎn)生較優(yōu)化的電路case(1 b1)conditionl : statement ;condition? : statement ; default : statement;endcase3.7 狀態(tài)機(jī)將狀態(tài)機(jī)的描述分成兩個(gè)always塊,一個(gè)用來描述組合邏輯,一個(gè)用來描述時(shí)序邏輯。(建議)用參數(shù)語句來定義狀態(tài)向量。(建議)將狀態(tài)機(jī)的邏輯和非狀態(tài)機(jī)的邏輯分成不同的模塊,以便于綜合工具對狀態(tài)機(jī)進(jìn)行單
29、獨(dú)優(yōu)化。必須使用default條件為狀態(tài)機(jī)指定一個(gè)默認(rèn)的狀態(tài),防止?fàn)顟B(tài) 機(jī)進(jìn)入死鎖狀態(tài)。FSM提供防死鎖機(jī)制,以防止限死在某個(gè)狀態(tài), 特別是在異常情況下。在FSM邏輯比較復(fù)雜的時(shí)候,建議使用獨(dú)熱編碼方式,以提高時(shí) 序。/ PART 1: COMBINATERIAL LOGIC FOR NEXT STATEalways (cur_state or full_new_fr or full or have_space)begin: OVC_FSM_NXT_STcase (cur_state)STDBY:beginif (full_new_fr = 1b1)nxt_state = W_BLOCK;el
30、se if (full = 1b1)nxt_state = W_DSCD;elsenxt_state = cur_state;endW_BLOCK:beginif (have_space = 1b1)nxt_state = STDBY;elsenxt_state = cur_state;endW_DSCD:beginif (have_space = 1b1)nxt_state = STDBY;elsenxt_state = W_BLOCK;enddefault:nxt_state = STDBY;endcaseend / OVC_FSM_NXT_ST/ PART 2: SEQUENTIAL L
31、OGIC FOR CURRENT STATEalways (posedge clk or RST_EDGE reset)begin: OVC_FSM_ST_TRANSif(reset = RST_VALUE)cur_state = DLY W_BLOCK;elsecur_state = DLY nxt_state;end / OVC_FSM_ST_TRANS狀態(tài)機(jī)輸出異步控制信號(hào)時(shí),必須采用下列結(jié)構(gòu)3.8 異步邏輯(建議)避免使用異步邏輯。異步邏輯難于設(shè)計(jì)和驗(yàn)證,并會(huì)降 低設(shè)計(jì)的可移植性。(建議)如果在設(shè)計(jì)中使用異步邏輯,將異步邏輯和同步邏輯分成不同的模塊。這使得代碼檢查更加容易(異步邏輯通常
32、需要仔細(xì)的檢查和功能及時(shí)序上的驗(yàn)證)。異步信號(hào)必須使用兩級(jí)觸發(fā)器同步之后使用。如下圖所示4 模塊劃分(建議)對設(shè)計(jì)層次中的每一個(gè)模塊,鎖存模塊的所有輸出信號(hào)。這樣做可以簡化處理過程, 它使得輸出的驅(qū)動(dòng)強(qiáng)度和輸入延時(shí) 都可預(yù)期。輸出驅(qū)動(dòng)強(qiáng)度是觸發(fā)器的平均驅(qū)動(dòng)強(qiáng)度。(建議)保持相關(guān)的組合邏輯在同一個(gè)模塊中。這有利于綜合工具對邏輯的優(yōu)化,也有利于時(shí)序預(yù)算和快速仿 真。(建議)對不同設(shè)計(jì)目標(biāo)的電路分成不同的模塊將含有關(guān)鍵路徑的邏輯和非關(guān)鍵路徑的邏輯分成不同的模塊, 以便綜合工具對關(guān)鍵路徑采用速度優(yōu)化,對非關(guān)鍵路徑采用面積 優(yōu)化。(建議)確保只有在頂層模塊中才包括 I/O PAD頂層模塊中還包 括一個(gè)中
33、層模塊,該模塊中包含 JTAG模塊、時(shí)鐘產(chǎn)生電路、CORE 邏輯。這個(gè)要求不是強(qiáng)制性的,但這樣做易于集成測試邏輯、PAD和功能邏輯(建議)避免在頂層模塊中出現(xiàn)Glue logic5 提高可移植性的編碼風(fēng)格5.1 采用參數(shù)化設(shè)計(jì)(建議)不要直接使用數(shù)字在設(shè)計(jì)中不要直接使用數(shù)字(Hard-Coded Numeric Value)。作為例外,可以使用0和1 (但不要組合使用,如 1001)。例如:差的編碼風(fēng)格:wire7:0my_in_bus;reg7:0my_out_bus;好的編碼風(fēng)格:Define MY_BUS_SIZE 8 wire MY_BUS_SIZE-1:0 my_in_bus;reg
34、 MY_BUS_SIZE-1:0 my_out_bus;另一種較好的編碼風(fēng)格,有利于IP封裝:parameter BUS_SIZE = 8 ;wire BUS_SIZE-1:0my_in_bus ;regBUS_SIZE-1:0my_out_bus(建議)將一個(gè)設(shè)計(jì)的所有的define 語句集中到一個(gè)單獨(dú)的文件。5.2 采用獨(dú)立于工具平臺(tái)和工藝庫的設(shè)計(jì)(建議)避免嵌入式的 EDACC具的命令。不要在源代碼中使用嵌入式的EDA工具命令。因?yàn)槠渌腅DAT具并不一定認(rèn)得這些隱含的命令,導(dǎo)致差的或錯(cuò)誤的結(jié)果,降低代碼的可移植性。即使是使用Design Compiler ,當(dāng)綜合策略改變是,嵌在源代碼
35、中的綜合命令也不如單獨(dú)的script文件中的綜合命令容易修改。例如:1: /synopsys async_set_reset “reset ”2: always (posedge clk or posedge reset)諸如第一行之類的工具命令最好不要使用。這個(gè)規(guī)則有一個(gè)例外就是編譯開關(guān)的打開和關(guān)閉可以嵌入到代碼中。例如:/synopsys translate_offsynopsys translate_on(建議)使用獨(dú)立于工藝的庫。(建議)在設(shè)計(jì)中避免實(shí)例化(instantiate )門,門級(jí)設(shè)計(jì)難于 理解、維護(hù)和重用。如果使用的特定工藝的門,設(shè)計(jì)將變得不可移植。如果必須使用特定工藝的門
36、,建議將它們放于單獨(dú)得模塊,這樣在移植時(shí)易于更改。5.3 盡量使用已經(jīng)得到驗(yàn)證的IP(1)對于通用的接口和常用的模塊,盡量使用已經(jīng)得到驗(yàn)證的IP(2)盡量對自己設(shè)計(jì)的模塊采用參數(shù)化設(shè)計(jì),在得到充分驗(yàn)證之后, 能被其他項(xiàng)目當(dāng)作IP使用,提高其他設(shè)計(jì)的可靠性,縮短設(shè)計(jì)周期。bad: module add (a,b,c);input 7:0 a,b;output 7:0 c ; better:module add (a,b,c);parameter WIDTH = 8 ;input WIDTH-1:0 a,b ;output WIDTH-1:0 c;6 其他一些設(shè)計(jì)建議整個(gè)項(xiàng)目組都使用一致的信號(hào)命名
37、規(guī)則。盡量避免使用復(fù)雜的運(yùn)算符,如*, /, % o特別是/, % ,大部分綜合器的支持是非常有限的(只支持常量)。提供方便調(diào)試的功能:比如增加可讀的標(biāo)志寄存器、統(tǒng)計(jì)計(jì)數(shù)、FIFO的狀態(tài)寄存器等等。在地址空間允許的范圍內(nèi),盡量使內(nèi)部關(guān)鍵觸發(fā)器能夠通過CPU接口被CPU訪問和控制,如計(jì)數(shù)器,移位寄存器,狀態(tài)機(jī)寄存器堂堂穹穹Bad: reg7:0 cnt ;Always (posedge clk or posedge rst)If (rst =1 b1)cnt = 0 ;Else if (cnt_en=1 b1)cnt = cnt +_1 ;better:reg7:0 cnt;always (po
38、sedge clk or posedge rst)if (rst =1 b1)cnt = 0 ;else if (cnt_en | test_cnt_en)cnt = cnt + 1 ;盡量避免使用異步 FIFO,采用將速度較慢側(cè)的讀或者寫使能信號(hào) 同步到速度較快側(cè),然后使用同步FIFO實(shí)現(xiàn)。對于FPG破計(jì),適當(dāng)限制組合邏舁t的輸入信號(hào)數(shù)目(4個(gè)以下最好)。在一個(gè)logic block 中fan-in 數(shù)目是固定的;組合邏輯如 果需要跨越Logic block ,則延遲會(huì)大大增加。這對提高Timing很有用。對于FPGAS計(jì),一般情況先使用塊 RAM在塊RA帳源不夠的情 況下才使用分散 RAM
39、而且分散RAM勺接口時(shí)序最好與塊 RAM勺時(shí) 序一致,便于隨時(shí)調(diào)整 RAM勺使用狀況。邏輯級(jí)數(shù)過多的功能塊,使用寄存器隔離,提高設(shè)計(jì)的綜合時(shí)的 時(shí)鐘頻率。不要使用位寬過大的計(jì)數(shù)器,建議將位寬超過 8的計(jì)數(shù)器打散成 多個(gè)不超過8bit寬度的計(jì)數(shù)器。計(jì)數(shù)器要求可被 CPUS接訪問,并且每個(gè)打散后的小計(jì)數(shù)器都有CPUM控的計(jì)數(shù)使能信號(hào)Bad: reg31:0 cnt ;Always (posedge clk or posedge rst)If (rst =1 b1)cnt = 0 ;Else if (cnt_en=1 b1 )cnt = cnt +_1 ;better:reg7:0 cnt0,cnt
40、1,cnt2,cnt3;wire cnt0_en,cnt1_en,cnt2_en,cnt3_en ;assign cnt0_en = cnt_en | test_cnt_en ;assign cnt1_en = (&cnt0 & cnt_en) | test_cnt_en;always (posedge clk or posedge rst)if (rst =1 b1)else if (cnt0_en =1 bl)cnt0 = cnt0 + 1 ;盡可能地使用FPGAC:具能提供的Cores。例如ALTERA/Xilinx的 FPG肋嵌的DSP可以用于實(shí)現(xiàn)比較復(fù)雜的數(shù)學(xué)計(jì)算公式、算法, 而且不占用原有的LUT資源。養(yǎng)成良好的習(xí)慣:每個(gè)模塊代碼完成之后單獨(dú)綜合,或者幾個(gè)子模塊合成一個(gè)功能相對完整的模塊時(shí)綜合一次,把相應(yīng)的 warnning或者latch去掉,不能去除的 warning需要全部加以說 明,并以文檔方式記錄。7 附件1. Verilog 編碼文檔模板:sample.v*/ Company : UTStarcom/Copyright(c)2003, UTStarcom Telecom Co.,Ltd./All rights reserved/ Project Name :/ Filename : xxx.v/ D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年沅陵縣招教考試備考題庫附答案
- 碳酸鋰蒸發(fā)工復(fù)試水平考核試卷含答案
- 片劑工崗前技術(shù)應(yīng)用考核試卷含答案
- 2024年邵陽市特崗教師筆試真題匯編附答案
- 質(zhì)檢員安全檢查競賽考核試卷含答案
- 金箔制作工崗前工作規(guī)范考核試卷含答案
- 自然水域救生員變革管理考核試卷含答案
- 碳酸鋰轉(zhuǎn)化工安全培訓(xùn)模擬考核試卷含答案
- 危險(xiǎn)廢物處理工誠信道德模擬考核試卷含答案
- 口腔設(shè)備組裝調(diào)試工安全管理考核試卷含答案
- 2025桐梓縣國土空間規(guī)劃城市年度體檢報(bào)告成果稿
- ISO-26262功能安全培訓(xùn)
- 2025浙江杭州錢塘新區(qū)建設(shè)投資集團(tuán)有限公司招聘5人備考筆試試題及答案解析
- 智能家居銷售培訓(xùn)課件
- 2025-2026學(xué)年小學(xué)蘇少版(2024)新教材一年級(jí)上冊美術(shù)期末測試卷及答案
- 2025-2026學(xué)年北師大版六年級(jí)數(shù)學(xué)上冊期末測試卷及答案
- 不同類型休克的床旁超聲鑒別診斷策略
- 企業(yè)ESG審計(jì)體系構(gòu)建-洞察及研究
- 政治理論考試試題庫100題
- 2025醫(yī)療器械經(jīng)營質(zhì)量管理體系文件(全套)(可編輯?。?/a>
- 物業(yè)與商戶裝修協(xié)議書
評論
0/150
提交評論