新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Verilog HDL基礎(chǔ)知識(shí)9之代碼規(guī)范

Verilog HDL基礎(chǔ)知識(shí)9之代碼規(guī)范

作者: 時(shí)間:2024-02-26 來(lái)源:電子森林 收藏

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 (大寫)
例化名 :U
XXX (大寫)
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ī)范。

全稱縮寫中文含義
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減一
delaydly
disabledis不使能
errorerr錯(cuò)誤(指示)
enableen使能
framefrm
generategen生成,如CRC生成
grantgnt申請(qǐng)通過(guò)
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)求
resetrst
segmentseg
soucescr源(端口)
ststisticsstat統(tǒng)計(jì)
timertmr定時(shí)器
switchersfSwitch fabric
temporarytmp臨時(shí)
transmittx發(fā)送(幀數(shù)據(jù))相關(guān)
Validvld(v)有效、校驗(yàn)正確
wr enablewen寫使能
writewr寫操作

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) data
in, 寄存一拍datainff1,寄存兩拍datainff2
f.不能用 ”reg”,作為最后的后綴名,因?yàn)榫C合工具會(huì)給寄存器自動(dòng)加上reg, 如果命名里就用reg作為后綴名則擾亂了網(wǎng)表的可讀性。



關(guān)鍵詞: FPGA verilog HDL 代碼規(guī)范

評(píng)論


相關(guān)推薦

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

關(guān)閉