消失了好久,沒有寫文章,也沒有做筆記,因?yàn)樽罱仝s一個比賽,時(shí)間很緊,昨天周六終于結(jié)束了,所以趁著周末這會兒有時(shí)間,寫點(diǎn)東西,記錄下來。首先我學(xué)習(xí)FPGA才一年多,我知道自己沒有資格談?wù)撘恍┍容^深層次的問題,對于這個行業(yè)來說可能我才是一直腳踩在門外面。所以這篇文章是寫給一些剛開始學(xué)習(xí)FPGA、Verilog HDL的同學(xué),我看過一些大神寫的代碼,然后盡量模仿大神寫法,經(jīng)過好幾個大神的影響和自己的習(xí)慣摸索,最終算是總結(jié)出了一套自己的代碼書寫風(fēng)格,當(dāng)然我的代碼風(fēng)格還是一直在進(jìn)化中。現(xiàn)在將自己的一些經(jīng)驗(yàn)總結(jié)出來,希望對剛開始學(xué)習(xí)FPGA的朋友有所幫助。
首先,第一我還是要強(qiáng)調(diào)的是編輯器的作用,工欲善其事,必先利其器。之前整理過一篇,如何高效的編寫Verilog HDL——菜鳥篇,點(diǎn)擊查看。其中我介紹了使用notepad++的一些小技巧,當(dāng)然還有很多網(wǎng)友使用gvim編輯器,對gVim編輯器,我也了解了很多,雖然上手比較麻煩,但是一勞永逸,我之后也是打算學(xué)習(xí)該編輯器的使用的,目前,時(shí)間比較緊,所以就暫且先用notepad++吧。熟悉verilog的人都知道,Verilog HDL設(shè)計(jì)其實(shí)使用20%的語法就可以設(shè)計(jì)出90%以上的電路,其中最長用的便是always塊了,用軟件自帶的IDE的話編寫效率其實(shí)是很差的。所以說一個好的順手的編輯器至關(guān)重要,對于我們這些苦逼的技術(shù)工作者來說,經(jīng)常看電腦屏幕一看就是一整天,然后還天天看,所以用Notepad++更換主題可以更好的為革命保護(hù)視力,
點(diǎn)擊設(shè)置——語言格式設(shè)置,可設(shè)置編輯器主題

這里我選擇的是如圖所示的主題,我比較喜歡這個比較暗的顏色,

最終呈現(xiàn)的效果便如下圖所示,是不是看起來很舒服呢!

第二、代碼的端口命名、內(nèi)部寄存器的命名。下圖是我們最近做的項(xiàng)目,可以看出在端口眾多的情況下,端口的命名有多重要,基本上從信號的命名就可以直接聯(lián)想到該信號的作用,同理,內(nèi)部使用寄存器的命名也是如此。對于使用的系統(tǒng)時(shí)鐘命令最好是用clk+后綴,加上時(shí)鐘的頻率。這樣不僅自己看起來方便,別人看起來也方便。因?yàn)楹芏嗲闆r下,不同開發(fā)板的晶振是不一樣的,但是編寫者知道,其他人就未必知道了。我還真見過always@(posedge A or negedge B)這樣寫的人的,當(dāng)然他也是剛開始學(xué)習(xí)了。
復(fù)位信號也直觀只要,我習(xí)慣上寫的而是rst+后綴,高電平有效還是低電平有效,rst_n(低電平有效negedge),rst_p(高電平有效posedge),我看過一些書上的復(fù)位信號命名的是clr,其實(shí)這兩種命名的方法根本沒有區(qū)別,一般情況下,我們復(fù)位都是將寄存器置數(shù)為0,也相當(dāng)于清零,但也不排除,復(fù)位是給置數(shù)的情況,所以我習(xí)慣上使用rst_n來復(fù)位,及低電平復(fù)位。
其他的信號也就類似的,總結(jié)下來上就是,給信號起一目了然的名字,盡量使用縮寫,不要信號的名字太長,信號的名字和功能作用中間用下劃線隔開,要習(xí)慣性的給信號后面編寫注釋,給你編寫的代碼塊做注釋,給你編寫的模塊做注釋,請記住你的代碼不是給你一個人寫的。

第三、代碼的工整。從上圖中可以看到,我在定義端口的時(shí)候是直接定義在module內(nèi)部的,很多人的寫法是先在module內(nèi)部定義一遍端口,然后再module下面再寫一遍input/output定義,其實(shí)這兩種方式都可以,那么我為什么選擇直接寫在module內(nèi)部呢,,,因?yàn)槲覒邪 T诰帉懘a的時(shí)候多用空格和TAB,把定義的信號對齊,這樣寫出代碼是很漂亮的,每一段代碼之間應(yīng)該用分隔線隔開,這樣整體看起來很清晰。

模塊端口的實(shí)例化也是,這樣的代碼自己看著漂亮,別人看著也舒服,而且從頂往下看都會很明了。

第四、在設(shè)計(jì)中多實(shí)用時(shí)序邏輯,尤其是直接需要輸出的端口。在我最近做的那個項(xiàng)目里,我使用了一些組合邏輯來做控制,但是后來發(fā)現(xiàn)這樣會有一個弊端,每次系統(tǒng)上電的時(shí)候會有一段不穩(wěn)定時(shí)間,在這段時(shí)間里,我的那幾個控制模塊就無規(guī)則的在亂啟動,即使是在復(fù)位的情況下,這樣可能會引起一些麻煩造成系統(tǒng)的不穩(wěn)定,如果采用是時(shí)序邏輯的話,就完全可以避免這個問題了,在系統(tǒng)上電的時(shí)候,復(fù)位低有效,等上電穩(wěn)定后,將復(fù)位鍵變?yōu)楦唠娖健?/p>
第五、如果一個工程里,同一個宏定義需要在多個文件里調(diào)用的話,建議使用調(diào)用文件。比如我在寫VGA驅(qū)動的時(shí)候,行掃描、場掃描和各種顏色的定義參數(shù)需要在多個模塊中使用,所以可在模塊內(nèi)部直接寫如下圖所示部分,把”`define”定義放在一個單獨(dú)的文件里面,”parameter”參數(shù)定義肯定必須是在模塊內(nèi)部了,檢查重復(fù)定義。


第六、使用異步復(fù)位、同步置數(shù)的設(shè)計(jì)思想(可以了解一下異步復(fù)位、同步釋放),而且一個always塊里,盡量值操作一個寄存器。一個模塊的代碼不要寫的太多,使用模塊化設(shè)計(jì),而且在頂層文件里盡量不了寫代碼,為了在檢查RTL圖的時(shí)候比較方便明了的看出各個模塊之間的連線圖。模塊內(nèi)部不應(yīng)該使用內(nèi)部使用,同一個模塊內(nèi)的時(shí)鐘應(yīng)該是同一個時(shí)鐘驅(qū)動下的,如果要使用別的時(shí)鐘進(jìn)行驅(qū)動的話,必須使用時(shí)鐘使能而不是時(shí)鐘觸發(fā),保持所有always塊是同一個時(shí)鐘上升沿觸發(fā),如果確實(shí)要使用內(nèi)部時(shí)鐘門控時(shí)鐘或內(nèi)部的復(fù)位信號將它們放在頂層將這些信號的產(chǎn)生放在頂層的一個獨(dú)立模塊這樣所有的子模塊分別使用單一的時(shí)鐘和復(fù)位信號。對于使用if——else if——else或case語句必須把所有的情況都寫上,避免生成鎖存器。最重要的第一點(diǎn),寄存器類型的數(shù)據(jù)應(yīng)該有復(fù)位,我不習(xí)慣使用initial語句進(jìn)行初始化,一般都是用異步復(fù)位來為維持系統(tǒng)的穩(wěn)定。還有平時(shí)寫代碼的時(shí)候盡量不要使用for循環(huán),當(dāng)然有些必要的時(shí)候也是可以用的。
第七、如果你遇到實(shí)在不好解決、苦思冥想都有邏輯錯誤的設(shè)計(jì),那么這個時(shí)候,你就可以考慮一下狀態(tài)機(jī)了。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1663文章
22486瀏覽量
638634 -
Verilog
+關(guān)注
關(guān)注
30文章
1374瀏覽量
114671 -
HDL
+關(guān)注
關(guān)注
8文章
332瀏覽量
49038 -
代碼
+關(guān)注
關(guān)注
30文章
4975瀏覽量
74308 -
編輯器
+關(guān)注
關(guān)注
1文章
828瀏覽量
33039
原文標(biāo)題:淺談Verilog HDL代碼編寫風(fēng)格
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Verilog HDL代碼書寫規(guī)范
勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載35:Verilog代碼風(fēng)格概述
Verilog HDL代碼描述對狀態(tài)機(jī)綜合的研究
基本組合邏輯功能雙向管腳的Verilog HDL源代碼
Verilog HDL入門教程
Verilog HDL入門教程之Verilog HDL數(shù)字系統(tǒng)設(shè)計(jì)教程
Verilog HDL入門教程
什么樣的Verilog代碼風(fēng)格是好的風(fēng)格?
如何使用參數(shù)化編寫可重用的verilog代碼
Vivado HDL編寫示例
一本Verilog HDL代碼對應(yīng)電路的書,助你快速編寫可綜合模型
淺談Verilog HDL代碼編寫風(fēng)格
評論