0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog有哪幾個版本?怎樣去寫出它?

FPGA之家 ? 來源:電子電路開發(fā)學習 ? 作者:wcc149 ? 2021-06-15 16:12 ? 次閱讀

眾所周知,用于FPGA開發(fā)的硬件描述語言(HDL)主要有兩種:Verilog和VHDL,VHDL的出現(xiàn)時間要比Verilog早,Verilog由于其簡單的語法,和C語言的相似性,目前被各大公司廣泛使用。

其實我大學時學習的是VHDL語言,后來由于公司都是使用的Verilog,又重新學習了Verilog,好在有C語言基礎,Verilog很快就上手了。

Verilog標準文檔主要有3個版本,分別是:

Verilog-1995

Verilog-2001

Verilog-2005

都是由IEEE頒布。目前最新的Verilog標準是2005版,相比于前兩個版本,2005更簡潔,更靈活。

雖然一些官方的代碼,如Xilinx一些IP核代碼,為了兼容以前的綜合工具,還是基于Verilog-2001標準,但我還是強烈建議你使用最新的Verilog-2005標準。

IEEE-2005

所以,本文都是基于IEEE-2005語法標準,即《IEEE P1364-2005/D3:Draft Standard for Verilog HardwareDescription Language》官方標準文檔。

良好的代碼規(guī)范可以提高代碼的可讀性、可復用性、簡潔清晰,這也是一種職業(yè)素質的體現(xiàn)。

我們的目標是:

WriteNowhere, ReadEverywhere

封面

都有哪些內容?

命名

文件命名

端口命名

變量命名

參數命名

結構

整體結構

端口聲明

空格和縮進讓代碼更清晰

小括號增加可讀性

例化

注釋

其他

IEEE-2005標準下載

命名

命名主要包括文件和模塊命名,端口命名,變量命名,參數命名等,概括來說就是:有意義,簡短易讀,重要的是不要使用拼音!

文件命名

文件名和模塊名保持一致,一個文件只寫一個模塊。

文件命名 文件命名要有含義,且簡短易讀,文件名統(tǒng)一使用小寫字母,并使用下劃線分割文件名。

底層驅動類模塊命名,使用drv_xxx類型,如:drv_led.v,drv_i2c.v,drv_ad7606.v

串口發(fā)送一字節(jié):uart_tx_byte.v

異步和同步FIFO,并指示深度和寬度:fifo_async_512_16.v和fifo_sync_256_64.v

TestBench文件名問源文件名后加_tb,如源文件drv_led.v,則對應的testbench文件命名為drv_led_tb.v

頂層模塊統(tǒng)一命名為top.v,或top_project_name.v,如EEPROM讀寫示例工程頂層命名為top_eeprom_demo.v

端口命名

端口命名和文件命名一樣,統(tǒng)一使用小寫字母,并使用下劃線進行分割。

如果是頂層模塊,而且是連接到實際的FPGA管腳,后加_pad_i,_pad_o,_pad_io來命名,表示連接到實際的FPGA硬件管腳上。

頂層端口命名

變量命名

時鐘信號統(tǒng)一使用clk命名,如果是特定時鐘頻率,可以在后面添加時鐘頻率,如clk_50m

復位信號統(tǒng)一使用rst命名,如果是低電平有效,后加_n表示,如rst_n

標志位命名:flag_rise/flag_fall/flag_clr

寄存器打拍信號命名添加_reg:reg rxd_reg

移位寄存器命名添加后綴_sreg:reg [3:0] busy_sreg

部分通用的縮寫:

縮寫 全拼 含義
rst reset 復位
clk cloc 時鐘
rd read 讀取
wr write 寫入
addr address 地址
ack acknowledge 響應

參數命名

Verilog中的參數類似于C語言中的define,主要有以下兩類localparam和parameter,兩者的區(qū)別是前者不可以在例化時進行參數傳遞,而后者可以在例化時進行參數傳遞。

其他的變量,文件名都是統(tǒng)一小寫,只有參數定義有全部大寫的待遇,當需要定義一些常量時,可以通過參數聲明指定一個有意義的名稱。如:

parameterLED_ON=1'b0; parameterLED_OFF=!LED_ON; parameterBAUD_RATE=115200; parameterTIME_100MS=25_000_000;

狀態(tài)機的狀態(tài)通常使用localparam來定義,并指定有意義的名稱,統(tǒng)一使用Sn_NAME的格式,并指定位寬。如:

localparamS0_IDLE=4'd0; localparamS1_START=4'd1; localparamS2_DOING=4'd2; localparamS3_END=4'd3; localparamS_FINISH=4'd4; localparamS_ERROR='d5;//autoadaptive

結構

整體結構

建議Verilog模塊文件按照如下結構進行書寫。

/*1.文件頭:說明版權信息,文件功能,作者,版本歷史等*/ /*2.端口聲明:input/output/inout*/ /*3.宏定義:`define*/ /*4.參數定義:localparam/parameter*/ /*5.寄存器定義:reg*/ /*6.線網類型定義:wire*/ /*7.互聯(lián)定義:assign*/ /*8.時序邏輯描述:always*/

示例:

/*1.filehead*/ /*********************************************************** Copyright2021'wechat:mcu149'.Allrightsreserved. FileName:drv_led.v Function:leddriver Author:mcu149 SVN: SVNRevision:1490 SVNDate:2021-06-051949 Revision: 2020-09-09:Rev1.0 2020-10-01:Rev1.1 ************************************************************/ /*2.input/output/inout*/ moduledrv_led( //Inputs inputrst_n, inputclk_50m, inputen, //Outputs outputled1, outputregled2=0//defineinitialvalueis0 ); /*3.define*/ /*4.parameter/localparam*/ parameterTIME_500MS=32'd25_000_000; /*5.reg*/ reg[31:0]cnt=0; /*6.wire*/ wireflag_toggle=(cnt==TIME_500MS); /*7.assign*/ assignled1=(en==0)?0:cnt[20]; /*8.alwaysblock*/ always@(posedgeclk_50m)begin if(!rst_n) cnt<=?0; ????else?if(flag_toggle) ????????cnt?<=?0; ????else? ????????cnt?<=?cnt?+?1; end always?@?(posedge?clk_50m)?begin ????if(!rst_n) ????????led2?<=?0; ????else?if(!en)? ????????led2?<=?0; ????else?if(en)?begin ????????if(flag_toggle) ????????????led2?<=?!led2; ????end end endmodule

端口聲明

輸入端口放在一起,輸出端口放在一起,雙向端口放在一起。如果某個輸出信號需要確定初始值,可以在端口定義時直接進行指定,這也是Verilog-2005新添加的功能。

端口命名

這一點有些朋友可能是按照功能進行劃分,如連接同一芯片的放在一起。

輸入輸出分開放的好處是,在例化時可以很方便的區(qū)分哪些是輸入哪些是輸出。

空格和縮進讓代碼更清晰

運算符兩端增加一個空格,可以讓程序結構更清晰,可讀性更高

縮進風格采用KR風格,即begin寫在行尾,不占用單獨一行,end單獨占用一行

縮進統(tǒng)一使用4個空格來代替TAB鍵

if/else等語句只有一行時,可以省略begin-end

合理添加空行進行塊區(qū)分,不同的always塊進行換行隔開

以下是兩種代碼的書寫規(guī)范,合理縮進,合理增加空格大大增加了可讀性。

合理縮進

小括號增加可讀性

在學校里有些考試題,為了考察學生對各種運算符優(yōu)先級的掌握程度,出一些反人類的題目。

而做實際項目不像考試,追求的是可讀性和易用性,所以當使用多個運算符時,為了增強可讀性,避免歧義,不要吝嗇使用小括號來表示運算的優(yōu)先級。

運算符優(yōu)先級

例化

例化可以認為是FPGA開發(fā)的靈魂所在了,例化的過程其實就是硬件模塊的調用過程,比如我們用Verilog描述了一個3-8譯碼器的模塊,可以在不同的地方去使用(例化)它,并分別命名為ut0/ut1/ut2等等,而且還可以在例化時指定參數,如串口發(fā)送和接收模塊,通過指定不同的參數來實現(xiàn)不同波特率的兼容。

例化和端口聲明順序保持一致,輸入端口放在一起,輸出端口放在一起

多比特信號,在例化時需要指定位寬,以增加可讀性

頂層模塊只進行模塊例化,不寫任何控制語句

示例:

wire[7:0]rx_data; wirerx_done; wirerx_err; /*串口接收1字節(jié)*/ uart_rx_byte#( .BAUD_RATE(32'd115200), .EN_PARITY(2'd0),//0:無校驗位,1:奇校驗,2:偶校驗 .EN_STOP_2(1'b0)//1:使能2位停止位 )uart_rx_byte_0( //Inputs .clk(clk_32m), .rst_n(rst_n), .rxd(uart_rxd), //Outputs .data_rx(rx_data[7:0]),//指定位寬 .done(rx_done), .err(rx_err) );

注釋

不要相信什么代碼就是最好的注釋!我不否認有些人的代碼寫的就是很規(guī)范,命名合理,格式清晰。

但是我覺得你還沒有達到那種程度,不能保證每一個人都能讀懂沒有注釋的代碼。注釋不僅是為了給別人看,更多的也是為了給自己看,好記性不如爛筆頭。

注釋統(tǒng)一使用/**/注釋的方式,或者使用與//混合使用,看個人習慣!

每個變量定義后需要注釋變量的功能

每個always塊功能需要注釋

狀態(tài)機狀態(tài)含義需要注釋

條件語句的后面需要添加注釋

代碼修改,注釋也要隨之修改

其他

合理使用generate for可以批量化定義和例化模塊,減少代碼量,提高可讀性

testbench中使用task和function可以提高效率

移位操作替換為拼接補0操作,更易讀

時序邏輯統(tǒng)一使用非阻塞賦值,即<=符號

一行字符不要超過80個,過長通過換行來處理

先有頂層設計,然后劃分子模塊功能,或者自底向上方法

模塊化設計,提高模塊可復用程度

能用case的盡量不要用if/else

reg類型變量,根據需要看是否鎖存。

責任編輯:lq6

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110107
  • vhdl
    +關注

    關注

    30

    文章

    817

    瀏覽量

    128141

原文標題:如何寫出易于維護的Verilog代碼?

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ADS9234R這個AD的寄存器如何配置,需要用到哪幾個引腳?

    請問一下,ADS9234R這個AD的寄存器如何配置,需要用到哪幾個引腳?時序是怎樣的?與復位信號什么關系?感覺官方文檔對寄存器配置這一塊描述比較少,我用FPGA與ADS9234R做接口,寫入寄出器參數,讀出總是不對。
    發(fā)表于 11-15 07:48

    用TPA3136典型應用電路波形異常,從哪幾個方面尋找問題?

    是這樣的,波形異常,展開后發(fā)現(xiàn)是和功放開關頻率一樣的噪聲疊加在上面的,請問我可以從哪幾個方面尋找問題,謝謝!
    發(fā)表于 10-09 09:01

    GUTOR備品備件主要包括哪幾個組成部分?

    GUTOR備品備件主要包括哪幾個組成部分?
    發(fā)表于 09-12 17:19

    labview的應用程序包括哪幾個部分

    LabVIEW(Laboratory Virtual Instrument Engineering Workbench)的應用程序主要由以下幾個部分組成: 前面板(Front Panel) : 功能
    的頭像 發(fā)表于 09-04 16:06 ?547次閱讀

    TAS2505-Q1的MCLK, WCLK, DIN, BCLK這幾個PIN,對應的mcu這邊的哪幾個pin?

    1.請問參考設計的中的耳機接口HPOUT 及 IOVSS,在PIN描述中沒有這兩個PIN呢? 2.請問2505的MCLK, WCLK, DIN, BCLK這幾個PIN,對應的mcu這邊的哪幾個pin?下面的這個圖片是MCU端的I2S接口描述,多謝!
    發(fā)表于 08-08 08:28

    can數據幀哪幾個域組成

    CAN(控制器局域網絡)是一種基于消息傳遞的通信協(xié)議,廣泛應用于汽車、工業(yè)自動化和嵌入式系統(tǒng)等領域。CAN協(xié)議的數據幀是用于傳輸信息的基本單位。 1. CAN數據幀概述 CAN數據幀是一種用于在CAN總線上傳輸數據的格式。一個典型的CAN數據幀由多個域組成,包括幀起始、仲裁域、控制域、數據域、CRC域和幀結束。每個域都有其特定的作用和格式。 2. 幀起始 幀起始是CAN數據幀的第一個域,用于標識一個新幀的開始。幀起始由一個單一的邏輯“0”位組成
    的頭像 發(fā)表于 07-24 15:14 ?1028次閱讀

    IGBT哪幾個工作區(qū)

    IGBT(絕緣柵雙極型晶體管)的工作區(qū)主要涉及其在不同工作狀態(tài)下的安全運行區(qū)域,這些區(qū)域定義了IGBT在特定條件下的電壓、電流及功率限制,以確保其穩(wěn)定運行并防止損壞。
    的頭像 發(fā)表于 07-24 10:52 ?1423次閱讀

    自動化技術主要包括哪幾個方面的內容

    自動化技術是現(xiàn)代工業(yè)和社會發(fā)展的重要驅動力,涉及到多個領域和方面。本文將詳細介紹自動化技術的主要內容,包括以下幾個方面: 自動化控制系統(tǒng) 自動化控制系統(tǒng)是自動化技術的核心,通過傳感器、執(zhí)行器
    的頭像 發(fā)表于 06-11 11:27 ?1984次閱讀

    Verilog版本哪些

    電子發(fā)燒友網站提供《Verilog版本哪些.docx》資料免費下載
    發(fā)表于 05-31 11:29 ?0次下載

    ADuC845來畫PCB的話,需要引出來哪幾個腳來燒錄?TXD和RXD嗎?

    我需要買什么下載器來下載嗎?如果我使用這個芯片來畫PCB的話,需要引出來哪幾個腳來燒錄?TXD和RXD嗎?
    發(fā)表于 05-31 06:09

    一個成熟的PCBA設計通常包含哪幾個方面?

    一站式PCBA智造廠家今天為大家講講什么是成熟的PCBA設計?成熟的PCB設計包含哪幾個方面?。成熟的PCB(印刷電路板組裝)設計是指經過精心規(guī)劃、優(yōu)化和驗證的設計,以確保電路板的功能性、可靠性以及
    的頭像 發(fā)表于 05-07 09:24 ?474次閱讀

    智己L6將配備超快充固態(tài)電池,突破千公里續(xù)航

    這其中有哪幾個方面值得我們關注呢?首先,據劉濤先生所述這款新能源汽車的能量密度非常高,能夠達到超 1000 公里的續(xù)航,而且更令人振奮的是,即使是四驅版本的車型也能做到這一點,讓大家不僅擁有持久的動力體驗,還能得到超長的續(xù)航持久力。
    的頭像 發(fā)表于 03-25 14:01 ?955次閱讀

    影響伺服電機剛性的哪幾個因素?伺服電機剛性過大導致什么后果?

    ? ? ? 伺服電機的剛性是指其對外部力和扭矩的響應能力,即電機的機械剛性和控制系統(tǒng)的響應速度。剛性對于伺服系統(tǒng)非常重要,因為直接影響到系統(tǒng)的性能和穩(wěn)定性。也是衡量伺服電機控制性能優(yōu)劣的重要指標
    的頭像 發(fā)表于 03-24 08:36 ?2245次閱讀

    汽車蓄電池正極幾條線都是接哪幾個地方的?

    汽車蓄電池正極幾條線都是接哪幾個地方的? 汽車蓄電池正極連接的地方幾個,下面將逐一進行詳細介紹。 1. 車輛電氣系統(tǒng):首先,汽車蓄電池的正極線會連接到車輛的電氣系統(tǒng)。這個系統(tǒng)包括車燈、喇叭、電動窗
    的頭像 發(fā)表于 02-06 10:34 ?4502次閱讀

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理:Linux內核負責管理和調度系統(tǒng)中的進程。通過進程調度算法來決定哪個進程在什么時間運行以及如何分配系統(tǒng)資源。 內存管理:Linux內核負責管理系統(tǒng)
    的頭像 發(fā)表于 01-22 14:34 ?2692次閱讀