Verilog HDL基礎(chǔ)知識(shí)9之代碼規(guī)范
1.RTL CODE 規(guī)范
1.1標(biāo)準(zhǔn)的文件頭
在每一個(gè)版塊的開頭一定要使用統(tǒng)一的文件頭,其中包括作者名,模塊名,創(chuàng)建日期,概要,更改記錄,版權(quán)等必要信息。 統(tǒng)一使用以下的文件頭:其中*為必需的項(xiàng)目
本文引用地址:http://2s4d.com/article/202402/455692.htm//******************************************************** // // Copyright(c)2016, ECBC // All rights reserved // // File name : MODULE_NAME.v // Module name : MODULE_NAME // Author : STEP // Description : // Email : Author’s email // Data : 2016/08/01 // Version : current version, just this: v1.0 // // Abstract : // // Modification history // Version Data(2016/08/01) V1.0 // Description // //*************************************************************
1.2標(biāo)準(zhǔn)的module格式
對(duì)于模塊的書寫采用統(tǒng)一的格式便于項(xiàng)目?jī)?nèi)部成員的理解和維護(hù),我們用批處理建立了一個(gè)MODULE模塊,其內(nèi)容解釋如下:
端口定義按照輸入,輸出,雙向的順序:
模塊名、模塊例化名統(tǒng)一,例化名前加大寫U以區(qū)分 ( 多次例化另加標(biāo)識(shí) ),三者關(guān)系:
文件名 :xxx .v (小寫)
模塊名 :XXX (大寫)
例化名 :UXXX (大寫)
IP 內(nèi)部所有的模塊名都要加IP名或者IP名簡(jiǎn)稱作前綴,如USBCTRL、USBTX_FIFO。
// ***************************** // DEFINE MODULE PORT // // ****************************** // module MODULE_NAME //模塊名一行 ( //括號(hào)頂格,端口部分換行 // INPUT //盡量先輸入,后輸出定義 input_port_1, //可同時(shí)按接口對(duì)象等分類,一行一個(gè) … input_port_m, // OUTPUT output_port_1, … output_port_m, ); // ***************************** // DEFINE PARAMETER // ****************************** parameter… //參數(shù)名采用大寫 // ****************************** // DEFINE INPUT // ****************************** input rst_n ; // reset, (active low) . //input到寄存器名之間四個(gè)tab鍵,注意對(duì)齊 input clk_* ; // clock signal , 50M . //注意注釋的格式,簡(jiǎn)潔有力,盡量使用英文 input [n:0] a_din ; // ***** //此處是在模塊名部分沒(méi)有聲明端口類型時(shí)用 input [k:0] b_din ; // ***** //注釋盡量不要挨到前面,然后全左對(duì)齊 // ****************************** // DEFINE OUTPUT // ****************************** output [m:0] a_dout ; // ***** //位寬定義和output之間加一個(gè)tab或空格,統(tǒng)一即可 output [i:0] b_dout ; // ***** // ****************************** // OUTPUT ATRRIBUTE // ****************************** // REGS reg [m:0] a_dout ; // ***** //WIRES wire [i:0] b_dout ; // ***** // ****************************** // INSTSNCE MODULE // ****************************** MODULE_NAME_A U_MODULE_NAME_A( //例化名從和模塊名相距四個(gè)tab,括號(hào)后換行 .A (A ), //端口和例化名對(duì)齊,后3個(gè)tab再括號(hào)連線 .B (B ), //括號(hào)內(nèi)3個(gè)tab的寬度,全對(duì)齊 .C (C ), ); … // ****************************** //MAIN CODE // ****************************** … … … … … … // ****************************** // endmodule //結(jié)尾頂格,中間部分均從一個(gè)tab開始
1.3一致的排版
A. 一致的縮排
//統(tǒng)一的縮排取4個(gè)空格寬度 //輸入輸出信號(hào)的寬度定義與關(guān)鍵字之間,信號(hào)名與寬度之間要用tab分開;所有寬度定義對(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==1’b0) syn_rst<= ‘DLY 1’b0; else begin if (a==b) syn_rst<= ‘DLY 1’b1; else syn_rst<= ‘DLY 1’b0; end end //if else 中僅有一個(gè)語(yǔ)句行時(shí),不要使用begin end; 如果有多個(gè)語(yǔ)句行時(shí),begin end和if ()或else ()空四個(gè)格。 格式如下: if (…) … else if (…) else //******************************************************************** if (…) … else if (…) begin … …( end else
1.4 一致的信號(hào)命名風(fēng)格
簡(jiǎn)潔,清晰,有效是基本的信號(hào)命名規(guī)則,詳見命名規(guī)范。
全稱 | 縮寫 | 中文含義 |
---|---|---|
acknowledge | ack | 應(yīng)答 |
adress | addr(ad) | 地址 |
arbiter | arb | 仲裁 |
check | chk | 校驗(yàn),如CRC校驗(yàn) |
clock | clk | 時(shí)鐘 |
config | cfg | Configuration,裝置 |
control | ctrl | 控制 |
count | cnt | 計(jì)數(shù) |
data in | din(di) | 數(shù)據(jù)輸入 |
data out | dout(do) | 數(shù)據(jù)輸出 |
decode | de | 譯碼 |
decrease | dec | 減一 |
delay | dly | |
disable | dis | 不使能 |
error | err | 錯(cuò)誤(指示) |
enable | en | 使能 |
frame | frm | 幀 |
generate | gen | 生成,如CRC生成 |
grant | gnt | 申請(qǐng)通過(guò) |
increase | inc | 加一 |
input | in(i) | |
length | len | (幀、包)長(zhǎng) |
nmport | nm | 網(wǎng)管相關(guān) |
output | out(o) | |
packet不推薦packet | pkt | 與幀相同 |
priority | pri | 優(yōu)先級(jí) |
pointer | ptr | 指針 |
rd enable | ren | 讀使能 |
read | rd | 讀(操作) |
ready | rdy | 應(yīng)答信號(hào)或準(zhǔn)備好 |
receive | rx | (幀數(shù)據(jù))接收 |
request | req | (服務(wù)、仲裁)請(qǐng)求 |
reset | rst | |
segment | seg | |
souce | scr | 源(端口) |
ststistics | stat | 統(tǒng)計(jì) |
timer | tmr | 定時(shí)器 |
switcher | sf | Switch fabric |
temporary | tmp | 臨時(shí) |
transmit | tx | 發(fā)送(幀數(shù)據(jù))相關(guān) |
Valid | vld(v) | 有效、校驗(yàn)正確 |
wr enable | wen | 寫使能 |
write | wr | 寫操作 |
a.端口、信號(hào)、變量名的所有字母小寫:函數(shù)名、宏定義、參數(shù)定義用大寫
b.使用簡(jiǎn)稱、縮略詞(加上列表)
c.基于含義命名(避免以數(shù)字命名的簡(jiǎn)單做法),含義可分段(最多分三段),每一小段之間加下劃線””,如txdataval;命名長(zhǎng)度一般限制在20個(gè)字符以內(nèi)。
d.低電平有效信號(hào),加后綴”n”,如 rstn
e.無(wú)條件寄存的寄存信號(hào)在原信號(hào)上加ff1、ff2… 如原信號(hào) datain, 寄存一拍datainff1,寄存兩拍datainff2
f.不能用 ”reg”,作為最后的后綴名,因?yàn)榫C合工具會(huì)給寄存器自動(dòng)加上reg, 如果命名里就用reg作為后綴名則擾亂了網(wǎng)表的可讀性。
評(píng)論