勇敢的芯伴你玩轉Altera FPGA連載34:Verilog代碼書(shū)寫(xiě)規范 特權同學(xué),版權所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD ![]() 雖然沒(méi)有“國際標準”級別的Verilog或VHDL代碼書(shū)寫(xiě)規范可供參考,但是相信每一個(gè)稍微規范點(diǎn)的做FPGA設計的公司都會(huì )為自己的團隊制定一套供參考的代碼書(shū)寫(xiě)規范。畢竟一個(gè)團隊中,大家的代碼書(shū)寫(xiě)格式達到基本一致的情況下,相互查閱、整合或移植起來(lái)才會(huì )“游刃有余”。因此,希望初學(xué)者從一開(kāi)始就養成好的習慣,盡量遵從比較規范的書(shū)寫(xiě)方式。話(huà)說(shuō)“幸福的家庭都是一樣的,不幸的家庭各有各的不幸”,我們也相信,盡管不同的公司為自己的團隊制定的Verilog或VHDL代碼書(shū)寫(xiě)規范可能略有差異,但是真正好的書(shū)寫(xiě)規范應該都是大同小異的。所以,對于網(wǎng)絡(luò )上漫天飛舞的書(shū)寫(xiě)規范,筆者本著(zhù)“取其精華去其糟粕”的精神和大家一同分享。這里也不刻意區分verilog和VHDL書(shū)寫(xiě)規范上的不同,只是談?wù)撘恍┗镜目晒┳裱囊幏丁?/div> 標識符 包括語(yǔ)法保留的關(guān)鍵詞、模塊名稱(chēng)、端口名稱(chēng)、信號名稱(chēng)、各種變量或常量名稱(chēng)等。語(yǔ)法保留的關(guān)鍵詞是不可以作為后面幾種名稱(chēng)使用的,Verilog和VHDL的主要關(guān)鍵字如下: Verilog關(guān)鍵詞 always endmodule medium reg tranif0 and end primitive module release tranif1 assign endspecify nand repeattri attribute endtable negedge rnmos tri0 begin endtask nmos rpmos tri1 buf event nor rtrantriand bufif0 for not rtranif0 trior bufif1 force notif0 rtranif1 trireg case forever notif1 scalared unsigned casex fork or signed vectored casez function output small wait cmos highz0 parameter specify wand deassign highz1 pmos specparam weak0 default if posedge strength weak1 defparam ifnone primitive strong0 while disable initial pull0 strong1 wire edge inout pull1 supply0 wor else input pulldown supply1 xnor end integer pullup table xor endattribute join remos task endcase large real time endfunction macromodule realtime tran VHDL關(guān)鍵詞 abs downto library postponed subtype access else linkage procedure then after elsif literal process to aliasend loop pure transport all entity map range type and exit mod record unaffected architecture file nand register units array for new reject until assert function next rem use attribute generate nor report variable begin generic not return wait block group null rol when body guarded of ror while buffer if on select with bus impure open severity xnor case in or shared xor component inertial others signal configuration inout out sla constant is package sra disconnect label port srl 除了以上這些保留的關(guān)鍵詞不可以作為用戶(hù)自定義的其他名稱(chēng),verilog和VHDL還有以下的一些用戶(hù)自定義命名規則必須遵循: ● 命名中只能夠包含字母、數字和下劃線(xiàn)“_”(verilog的命名還可以包含符號“$”)。 ● 命名的第一個(gè)字符必須是字母(verilog的命名授字符可以是下劃線(xiàn)“_”,但一般不推薦這么命名)。 ● 在一個(gè)模塊中的命名必須是唯一的。 ● VHDL的命名中不允許連續出現多個(gè)下劃線(xiàn)“_”,也不允許下劃線(xiàn)“_”是命名的最后一個(gè)字符。 關(guān)于模塊名稱(chēng)、端口名稱(chēng)、信號名稱(chēng)、各種變量或常量名稱(chēng)等的命名,有很多推薦的規則可供參考,如下: ● 盡可能使用能表達名稱(chēng)具體含義的英文單詞命名,單詞名稱(chēng)過(guò)長(cháng)時(shí)可以采用易于識別的縮寫(xiě)形式替代,多個(gè)單詞之間可以用下劃線(xiàn)“_”進(jìn)行分割。 ● 對于出現頻率較高的相同含義的單詞,建議統一作為前綴或后綴使用。 ● 對于低電平有效的消耗,通常加后綴“_n”表示。 ● 在同一個(gè)設計中,盡可能的統一大小寫(xiě)的書(shū)寫(xiě)規范。(很多規范里對命名的大小寫(xiě)書(shū)寫(xiě)格式有要求,但是筆者這里不做詳細規定,大家可以根據自己的需要設定。) 格式 這里的格式主要是指每個(gè)代碼功能塊之間、關(guān)鍵詞、名稱(chēng)或操作符之間的間距(行間距、字符間距)規范。得體的代碼格式不僅看起來(lái)美觀(guān)大方,而且便于閱讀和調試。關(guān)于格式,可能不同的公司也都有相關(guān)的規范要求,筆者在此建議大家盡量遵循以下一些原則: ● 每個(gè)功能塊(如verilog的always邏輯、VHDL的process邏輯)之間盡量用一行或數行空格進(jìn)行隔離。 ● 一個(gè)語(yǔ)法語(yǔ)句一行,不要在同一行寫(xiě)多個(gè)語(yǔ)法語(yǔ)句。 ● 單行代碼不宜過(guò)長(cháng),所有代碼行長(cháng)度盡量控制在一個(gè)適當的便于查看的范圍。 ● 同層次的語(yǔ)法盡量對齊,使用Tab鍵(通常一個(gè)Tab對應四個(gè)字符寬度)進(jìn)行縮進(jìn)。 ● 行尾不要有多余的空格。 ● 關(guān)鍵詞、各類(lèi)名稱(chēng)或變量、操作符相互間都盡量保留一個(gè)空格以作隔離。 注釋 Verilog的注釋有“/* */”以及“//”兩種方式!/*”左側和“*/”右側之間的部分為注釋內容,此注釋可以用在行前、行間、行末或多行中;“//”后面的內容為注釋?zhuān)撟⑨屩豢捎迷谛心ó斎涣,它也可以頂個(gè),那么意味著(zhù)整行都是注釋?zhuān)?/div> VHDL的注釋只有“--”一種。類(lèi)似verilog的“//”,“--”后面的內容為注釋?zhuān)撟⑨屩豢捎迷谛心?/div> 注釋的擺放和寫(xiě)法通常也有講究,幾個(gè)要點(diǎn)歸納如下: ● 每個(gè)獨立的功能模塊都要有簡(jiǎn)單的功能描述,對輸入輸出信號功能進(jìn)行描述。 ● 無(wú)論習慣在代碼末注釋還是代碼上面注釋?zhuān)粋(gè)模塊或工程中盡量保持一致。 ● 注釋內容簡(jiǎn)明扼要,不要過(guò)于冗長(cháng)或寫(xiě)廢話(huà)(例如:add = add+1; //add自增)。 |