verilog書寫規(guī)范.doc_第1頁
verilog書寫規(guī)范.doc_第2頁
verilog書寫規(guī)范.doc_第3頁
verilog書寫規(guī)范.doc_第4頁
verilog書寫規(guī)范.doc_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

海思高校合作QA培訓(xùn)資料一、 RTL CODE 規(guī)范1.標(biāo)準(zhǔn)的文件頭 在每一個(gè)版塊的開頭一定要使用統(tǒng)一的文件頭,其中包括作者名,模塊名,創(chuàng)建日期,概要,更改記錄,版權(quán)等必要信息。統(tǒng)一使用以下的文件頭:/ */ COPYRIGHT(c)2005, Hislicon Technologies Co, Ltd/ All rights reserved./ IP LIB INDEX : IP lib index just sa UTOPIA_B/ IP Name : the top module_name of this ip, usually, is same/ as the small ip classified name just as UTOPIA/ File name : file_name of the file just as “tx_fifo.v”/ Module name : module_name of this file just as “TX_FIFO”/ Full name : complete Emglish nme of this abbreviated/ Author : Athor/ID / Email : Authors email/ Data : / Version : V 1.0 / /Abstract :/ Called by : Father Module/ / Modification history/ -/ / $Log$/ *2. 標(biāo)準(zhǔn)的module 格式 (module 整體結(jié)構(gòu))對(duì)于模塊的書寫采用統(tǒng)一的格式便于項(xiàng)目?jī)?nèi)部成員的理解和維護(hù),我們用批處理建立了一個(gè)MODULE模塊,其內(nèi)容解釋如下:l 端口定義按照輸入,輸出,雙向的順序:l 模塊名、模塊例化名統(tǒng)一,例化名前加大寫U_以區(qū)分 ( 多次例化另加標(biāo)識(shí) ),三者關(guān)系:文件名 :xxx .v (小寫)模塊名 :XXX (大寫)例化名 :U_XXX (大寫)IP 內(nèi)部所有的模塊名都要加IP名或者IP名簡(jiǎn)稱作前綴,如USB_CTRL、USB_TX_FIFO。/ */ DEFINE MODULE PORT / */ module MODULE_NAME ( / INPUT input_port_1, input_port_m, / OUTPUT output_port_1, output_port_m, );/ */ DEFINE PARAMETER / *parameter/ */ DEFINE INPUT/ *input rst_n ; / reset, active low .input clk_* ; / clock signal , 50M .input n:0 a_din ; / *input k:0 b_din ; / */ */ DEFINE OUTPUT / *output m:0 a_dout ; / *output i:0 b_dout ; / */ */ OUTPUT ATRRIBUTE / */ REGSreg m:0 a_dout ; / */WIRESwire i:0 b_dout ; / * / */ INSTSNCE MODULE / *MODULE_NAME_A U_MODULE_NAME_A( .A (A ), .B (B ), .C (C ), ); / */MAIN CODE / * / * / Endmodule3.一致的排版A. 一致的縮排l 統(tǒng)一的縮排取4個(gè)空格寬度l 輸入輸出信號(hào)的寬度定義與關(guān)鍵字之間,信號(hào)名與寬度之間要用空格分開;所有寬度定義對(duì)所有信號(hào)名對(duì)齊,代碼風(fēng)格統(tǒng)一如下: input 3:0 input_a ; / * input input_b ; / * output 128:0 output_a ;output 15:0 output_b ;output output_c ;B. 一致的 begin end 書寫方式always 中,一定要用begin end 區(qū)分,格式和代碼風(fēng)格統(tǒng)一如下:always (postedge clk or negedge rst_n)begin if (rst_n=1b0)syn_rst= DLY 1b0; else begin if (a=b) syn_rst= DLY 1b1; else syn_rst= DLY 1b0; endendif else 中僅有一個(gè)語句行時(shí),不要使用begin end; 如果有多個(gè)語句行時(shí),begin end和if ()或else ()空四個(gè)格。格式如下:if ()else if ()else *if ()else if () begin ( endelse4. 一致的信號(hào)命名風(fēng)格簡(jiǎn)潔,清晰,有效是基本的信號(hào)命名規(guī)則,詳見命名規(guī)范。全稱縮寫中文含義acknowledgeack應(yīng)答adressaddr(ad)地址arbiterarb仲裁checkchk校驗(yàn),如CRC校驗(yàn)clockclk時(shí)鐘configcfgConfiguration,裝置controlctrl控制countcnt計(jì)數(shù)data indin(di)數(shù)據(jù)輸入data outdout(do)數(shù)據(jù)輸出decodede譯碼decreasedec減一delaydlydisabledis不使能errorerr錯(cuò)誤(指示)enableen使能framefrm幀generategen生成,如CRC生成grantgnt申請(qǐng)通過increaseinc加一inputin(i)lengthlen(幀、包)長(zhǎng)nmportnm網(wǎng)管相關(guān)outputout(o)packet不推薦packetpkt與幀相同prioritypri優(yōu)先級(jí)pointerptr指針rd enableren讀使能readrd讀(操作)readyrdy應(yīng)答信號(hào)或準(zhǔn)備好receiverx(幀數(shù)據(jù))接收requestreq(服務(wù)、仲裁)請(qǐng)求resetrstsegmentsegsoucescr源(端口) ststistics stat統(tǒng)計(jì) timer tmr定時(shí)器 switcher sfSwitch fabric temporary tmp臨時(shí)transmit tx發(fā)送(幀數(shù)據(jù))相關(guān)Valid vld(v)有效、校驗(yàn)正確 wr enablewen寫使能writewr寫操作a. 端口、信號(hào)、變量名的所有字母小寫:函數(shù)名、宏定義、參數(shù)定義用大寫b. 使用簡(jiǎn)稱、縮略詞(加上列表)c. 基于含義命名(避免以數(shù)字命名的簡(jiǎn)單做法),含義可分段(最多分三段),每一小段之間加下劃線”_”,如tx_data_val;命名長(zhǎng)度一般限制在20個(gè)字符以內(nèi)。d. 低電平有效信號(hào),加后綴”_n”,如 rst_ne. 無條件寄存的寄存信號(hào)在原信號(hào)上加ff1、ff2 如原信號(hào) data_in, 寄存一拍data_in_ff1,寄存兩拍data_in_ff2f. 不能用 ”reg”,作為最后的后綴名,因?yàn)榫C合工具會(huì)給寄存器自動(dòng)加上_reg, 如果命名里就用_reg作為后綴名則擾亂了網(wǎng)表的可讀性。5.統(tǒng)一的表達(dá)式書寫A. 括號(hào)的使用如果一個(gè)表達(dá)式的分組情況不是很明顯時(shí),加上括號(hào)有助于理解。例如下面的代碼加上括號(hào)就清晰很多。 if (&a=1b1&!flag=1b1 | b=1b1) /改為: if (&a=1b1)&(!flag=1b1)|( b=1b1) /B 適當(dāng)?shù)氖褂每崭褚话惚磉_(dá)式在運(yùn)算符的兩側(cè)要各留出一個(gè)空格,但定義比較長(zhǎng)的表達(dá)式,去掉預(yù)先級(jí)高的運(yùn)算符前的空格,使其與運(yùn)算對(duì)象緊連在一起,可以更清晰的顯示表達(dá)式結(jié)構(gòu)。 還是上面的例子:if (&a=1b1)&(!flag=1b1)|( b=1b1) /改為:if (&a = 1b1)&(!flag = 1b1)|( b = 1b1) /”=”, ”=”前后都要加空格。C 賦值要指明比特寬度 賦值或者條件判斷時(shí)要注明比特寬度,注意表達(dá)式的位寬匹配。如: reg 4:0 signal_a;錯(cuò)誤: 1 signal_a = 5;2 if(signal_a = 5)3 signal_a = signal_b3:0+4;正確: 1 signal_a = 5d52 if(signal_a = 5d5)3 signal_a = 1b0, signal_b3:0+5d4因?yàn)楣ぞ吣J(rèn)是32位寬,如果不注明位寬,工具檢查會(huì)報(bào)warning,而且這樣增加了設(shè)計(jì)的嚴(yán)謹(jǐn)性。6.統(tǒng)一的語句書寫條件判斷結(jié)構(gòu)書寫方式A. 條件的完整性 If else搭配使用,對(duì)于缺省的條件要寫”else;”; If elsed 條件判別式要全面,比如if(a = 1b0); Case中的缺省條件要寫”default”;B.”if else”結(jié)構(gòu):適用于復(fù)雜條件判斷的語句 但對(duì)于復(fù)雜的條件判斷,使用?:如果不仔細(xì)分析條件的每一條路徑,就讓讀代碼搞不清它是到底要做什么。例如: C = (!Ic&!rc)?0(Ic?rc:Ic) / (?:) 改為:always (Ic or rc) / if elsebegin if (Ic=0)&(rc=0) c = 0; else if (Ic=1) c = rc; else c = Ic;end即使是簡(jiǎn)單的條件判斷,我們也必須使用IF-ELSE,當(dāng)涉及復(fù)雜的條件判斷,使用IF-ELSE結(jié)構(gòu)以獲得清晰的結(jié)構(gòu)便于理解和維護(hù)。因此必須使用IF-ELSE。C.”IF ELSE”結(jié)構(gòu)VS”CASE”結(jié)構(gòu)IF ELSE結(jié)構(gòu)綜合的結(jié)構(gòu)可能是與或非門構(gòu)成的,也可能是一組多路選擇器,而case結(jié)構(gòu)綜合結(jié)果一般會(huì)是多路選擇器,但對(duì)于可以優(yōu)化的case綜合工具會(huì)綜合出更簡(jiǎn)單的結(jié)構(gòu)。所有對(duì)于可以寫出平行結(jié)構(gòu)的條件,優(yōu)先寫成case結(jié)構(gòu),例如地址譯碼等,條件之間有重復(fù)和嵌套的情況則是寫成if else結(jié)構(gòu)。D. Finite State Machine 不允許有模糊不清的狀態(tài)機(jī)模式,所有的狀態(tài)機(jī)必須清晰明了。 我們要求將狀態(tài)機(jī)的時(shí)序部分和組合邏輯部分分開。 例如: module state4 (clockresetout); input reset input clock; output 1:0 out; parameter 1:0 stateA=2b00; parameter 1:0 stateB=2b01; parameter 1:0 stateC=2b10; parameter 1:0 stateD=2b11; reg 1:0 state; reg 1:0 nextstate;reg 1:0 out;always (posedge clock)begin if (reset 1,0b0) state = stateA; else state = nextstate;endalways (state)begin case (state) stateA: begin nextstate = stateB; end stateB: begin nextstate = stateC; end stateC: begin nextstate = stateD; end stateD: begin nextstate = stateA; end endcase end always(postdge clock or negedge reset) begin if (reset1b0) out = 2b0; else begin if (state=) out = ; else out = ; end end endmodule 7. 統(tǒng)一格式的always程序塊的書寫 A. always 中的變量的賦值方式阻塞與非阻塞賦值 當(dāng)進(jìn)行時(shí)序邏輯建模時(shí),always塊中使用非阻塞賦值NON_BLOCKING; 參加如下代碼:always (posedge clk or negedge rst_n)begin if (rst_n = 1b0; myreg = 1b0; else myreg = DLY1b1;endalways塊中使用的NON_BLOCKING賦值時(shí)在”=”前要加上DLY,如上例;當(dāng)使用always語句進(jìn)行組合邏輯建模時(shí),always塊中使用阻塞賦值BLOCKING; 參見如下代碼: always (addr) begin case (addr) 2b00 : cs0_n=1b0; 2b01 : cs0_n=1b1; 2b10 : cs0_n=1b0; 2b11 : cs0_n=1b1; default: cs0_n=1b1; endcaseend 如果要使用always語句同時(shí)進(jìn)行時(shí)序與組合邏輯建模時(shí),一定使用非阻塞賦值;例如: /組合邏輯與時(shí)序邏輯在同一個(gè)always塊中 always(posedge clk or negedge reset_n) begin if(reset_n=1b0) out=1b0; else begin case(count) 2b00 : out= DLY in_a; 2b01 : out= DLY in_b; 2b10 : out= DLY in_c; 2b11 : out= DLY in_c; default: out= DLY in_a; endendBalways中變量賦值的唯一性 組合always塊一定要注意敏感量列表中的觸發(fā)項(xiàng)完整且不冗余;如果不是這樣,綜合的電路會(huì)與實(shí)際設(shè)計(jì)不符合,會(huì)報(bào)warning; 不要再多個(gè)always模塊中對(duì)同一個(gè)reg型變量進(jìn)行賦值; 更不能再同一個(gè)always中隨一個(gè)變量雙重賦值; 例如: always(posedge clk or posedge reset_n) begin if(reset_n=1b0) out=1b0; else out= DLY1b1; /out 1 0 out= DLY1b0; end 推薦不要在一個(gè)always塊里給多個(gè)變量賦值。如果將一組條件相同的變量寫在一個(gè)always塊中更有利于可讀性的提高和功能的實(shí)現(xiàn)時(shí)候,可有例外情況,但請(qǐng)盡量多加注釋,以增加可讀性,并注意在組合always塊中不要出現(xiàn)LATCH(不如對(duì)狀態(tài)機(jī)的組合always塊及它對(duì)條件相似的多個(gè)變量賦值);Calways中復(fù)位的書寫 復(fù)位的條件表達(dá)式及命名要和always敏感列表中的描述相統(tǒng)一,并且一定要使用異步復(fù)位。所有的復(fù)位必須低有效。 例如: / always(posedge clk ot negedge rst_n) / begin if(rst_n=1b0) else endDalways的注釋 要在每一個(gè)always塊之前加一段注釋,增加可讀性和便于調(diào)試。 /cm carry count which always(posedge clk_xc or negedge rst_n) begin if(rst_n=1b0) cm_carry_cnt=1b0; else cm_carry_cnt=#DLY1b1; end8合理的注釋 代碼中應(yīng)采用英文作詳細(xì)的注釋,注釋量應(yīng)達(dá)到代碼總量的50以上。 指示應(yīng)該與代碼一致,修改程序的時(shí)候一定要修改相應(yīng)的注釋; 注釋不應(yīng)重復(fù)代碼已經(jīng)表明的內(nèi)容,而是簡(jiǎn)介的點(diǎn)明程序的突出特征; 注釋應(yīng)該整個(gè)一個(gè)程序的線索和關(guān)鍵詞,它連接整個(gè)程序中分散的信息并它幫助理解程序中不能表明的部分。9重用化設(shè)計(jì) 層次結(jié)構(gòu)與模塊劃分 層次設(shè)計(jì)的原理以簡(jiǎn)單為主盡量避免不必要的層次;層次結(jié)構(gòu)設(shè)計(jì)得好,在綜合中就不需要太多的優(yōu)化過程; 模塊的劃分根據(jù)層次設(shè)計(jì)來決定模塊化對(duì)于布線有很大幫助,模塊化的設(shè)計(jì)中要盡量減少全局信號(hào)的使用; 通用的部分盡量提取出來作為一個(gè)共用模塊,同時(shí)為了適應(yīng)需求的更改也應(yīng)提供用戶定制模塊入庫的方式。 參數(shù)傳遞 需要傳遞參數(shù)的模塊,在多次例化的時(shí)候統(tǒng)一都傳遞參數(shù),不要例化同一個(gè)模塊,有的傳參數(shù),有的不傳。 模塊劃分的技巧: 將不同的時(shí)鐘域分離開來; 按照不同的設(shè)計(jì)目標(biāo)劃分成塊,分塊式應(yīng)在數(shù)據(jù)流方向上切分; 在同一模塊中實(shí)現(xiàn)邏輯資源和算術(shù)資源的共享。二關(guān)于REVIEW 1Review目的 發(fā)現(xiàn)缺陷 降低成本 提高質(zhì)量 2流程 1 完成第一個(gè)字模塊時(shí),請(qǐng)?zhí)峤辉撃K代碼,進(jìn)行規(guī)范檢查評(píng)審。2 Coding 期間 每?jī)尚瞧?提交依次代碼和review報(bào)告。 Review報(bào)告主要包括內(nèi)容: Review工作時(shí),review的代碼模塊 參與人 發(fā)現(xiàn)的缺陷和解決情況。 Review建議:(1) 制定review計(jì)劃;(2) 每次review代碼不超過500行。ANNEX CODE STYLE TEMPLATE This a template of verilog code file, including file header and the main body of code in which some coding rules are demonstrated./*/ Copyright(c)2005, Hisilicon Technologies Co., Ltd/ All rights reserved/ IP LIB INDEX : IP lib index just as UTOPIA_B/ IP Name : the top module_name of this ip, usually, is same as the small ip classified name just as UTOPIA/ File name : file_name of this file just as tx_fifo.v/ Module name : module_name of this file just as TX_FIFO/ Full name : complete English name of the abbreviated module_name/ Author : Author/ Email : Authors email/ Data : 2005/07/20/ Version : current version, just this: v1.0, must same as the CVS version/ Abstract : / Called by : Father module just as TX_PROC/ Modification history/ -/ Version Data(yyyy/mm/dd) name/ Description/ $Log$/*/*/DEFINE(s)/*/define UDLY 1 /Unit delay, for non-blocking assignments in sequential logic/*/DEFINE MODULE PORT/*module MODULE_NAME( /INPUT rest_n , clk_* , a_din , b_din , /OUTPUT a_dout , b_dout );/*/DEFINE PARAMETER/*/Parameter(s)/*/DEFINE INPUT/*input rst_n ; /reset, active low .input clk_* ; /clock signal, 50M .input n:0 a_din ; /*input k:0 b_din ; /*/*/DEFINE OUTPUT/*output m:0 a_dout ; /*output i:0 b_dout ; /*/*/OUTPUT ATTRIBUTE/*/REGSreg m:0 a_dout ; /*/WIRESwire i:0 b_dout ; /*/*/INNER SIGNAL DECLARATION/*/REGSreg 3:0 counter ; /*/WIRESwire 7:0 temp1 ; /*/*/INSTANTCE MODULE/*/*/instance of module MODULE_NAME_A filename:module_name_a.v/*MODULE_NAME_A U_MUDULE_NAME_A( .A (A ), .B (B ), .C (C ) );/*/MAIN CORE/*/Sequential logic stylealways(posedge clk_* or negedge rest_n)begin : SEQ_BLOCK_NAME if (rst_n=1b0) counter=4b0; else begin if (expression) counter = #DLY siginal_b; else; endend / SEQ_BLOCK_NAME/Combinational

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論