日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Verilog HDL 编程规范

發(fā)布時(shí)間:2023/12/20 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Verilog HDL 编程规范 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

目錄

前言

一、文件聲明

二、命名

三、注釋

四、模塊

五、wire、reg

六、表達(dá)式

七、條件語句

八、可綜合性

九、可重用性

十、同步設(shè)計(jì)

十一、循環(huán)語句

十二、約束

十三、PLL、DCM

十四、關(guān)于對(duì)齊

參考聲明



前言

????????本專欄的博文都是關(guān)于Verilog HDL 語法。目前(2021/9/7),本人接觸FPGA和Verilog HDL 語法也差不多有近半年的時(shí)間了。對(duì)于一些常規(guī)的模塊編寫、IP核配置、仿真等沒有太大問題。但是如果涉及到特別復(fù)雜的邏輯設(shè)計(jì)時(shí),也會(huì)出現(xiàn)較多的語法空白需要填補(bǔ)。所以我準(zhǔn)備以博客的形式重新整理相關(guān)的Verilog HDL 語法,做到知識(shí)的沉淀。

????????有很多從事FPGA數(shù)字設(shè)計(jì)的人都說過,掌握Verilog HDL 的基礎(chǔ)語法就能夠編寫將近90%的邏輯,盡管事實(shí)確實(shí)如此。但是全面一些我覺得會(huì)更好。因?yàn)樵O(shè)計(jì)的正確性和最優(yōu)性是兩個(gè)不同的概念。掌握基本的語法足夠讓你做到正確性,但是要想做到最優(yōu)設(shè)計(jì),必須要對(duì)語法有比較全面、透徹的認(rèn)識(shí)。

????????Verilog HDL 編程風(fēng)格和編程規(guī)范程度都很重要。規(guī)范的編程不僅是有助于自己排錯(cuò)查錯(cuò),也利于別人理解。盡量在初學(xué)階段就逐漸形成自己規(guī)范的編程風(fēng)格。

????????本文主要介紹一種規(guī)范的編程方式,供借鑒


一、文件聲明

每個(gè)文件的開始,最好有說明該文件的文字段。主要包括:

1、公司、版權(quán)

2、文件名

3、作者

4、日期

5、版本號(hào)

6、概述(此部分包括模塊的功能描述、注意事項(xiàng)、關(guān)鍵點(diǎn)等)

如果后期對(duì)該模塊進(jìn)行版本修改、升級(jí)、維護(hù)等,在原本的聲明文字后再添加對(duì)應(yīng)版本修改信息。方便后期整理維護(hù)。

文件聲明具體格式參考:

//----------------文件的相關(guān)說明-------------------//// 公司版權(quán):// 文件名稱: // 功能說明:// 作 者: // 設(shè)計(jì)日期: // 版 本:// 相關(guān)參考://----------------- 版 本 修 改--------------------//// 改后版本: // 修改日期: // 修改作者:// 修改原因:

二、命名

1、模塊(module)命名

? ? ? ? 一個(gè) Verilog 文件只能包含一個(gè)?module ,module 的名稱統(tǒng)一小寫或者大寫。盡量不要大小寫混著用。因?yàn)榇笮懬袚Q麻煩。這只是命名,不是設(shè)置密碼,模塊(module)的名稱要能夠有一定的功能、參數(shù)代表性。要做到見名識(shí)義。

2、parameter 命名

? ? ? ? 參數(shù) parameter 的命名統(tǒng)一大寫。本地參數(shù) localparam 也統(tǒng)一用大寫命名。建議用 parameter 、localparam 參數(shù)類型命名一些諸如數(shù)據(jù)位寬、版本號(hào)、狀態(tài)值等有意義的常數(shù),方便程序改版升級(jí)。

3、信號(hào)命名

? ? ? ? 輸入信號(hào)、輸出信號(hào)、內(nèi)部信號(hào)等的命名同一大寫或者小寫,不要混合使用(除了復(fù)位信號(hào))。信號(hào)名稱最好能見名識(shí)義。最好在信號(hào)名稱最前面添加信號(hào)性質(zhì)或者類型標(biāo)識(shí),方便使用。信號(hào)名稱不應(yīng)過長(zhǎng)(盡量小于20個(gè)字符)。信號(hào)名稱縮寫要有一定的通用性,不能過于生僻。

? ? ? ? 命名舉例:

input I_SYS_CLK, //系統(tǒng)時(shí)鐘 input I_ARst_n, //異步復(fù)位信號(hào) 低電平有效 input I_Rst_n, //同步復(fù)位信號(hào) 低電平有效 input I_ARst, //異步復(fù)位信號(hào) 高電平有效 input [15:0] I_FFT_DATA_RE,//FFT計(jì)算輸入數(shù)據(jù)實(shí)部 input [15:0] I_FFT_DATA_IM,//FFT計(jì)算輸入數(shù)據(jù)虛部output [15:0] O_FFT_RES_RE,//FFT計(jì)算結(jié)果實(shí)部 output [15:0] O_FFT_RES_IM,//FFT計(jì)算結(jié)果虛部 output O_VALID, //輸出有效信號(hào)wire W_READ_FLAG;//讀標(biāo)志信號(hào) wire [11:0] W_FIR_RES; //FIR濾波器輸出結(jié)果reg R_1_VALID; //valid 信號(hào)打一拍 reg R_2_VALID; //valid 信號(hào)打二拍 reg [15:0] R_COUNTER; //計(jì)數(shù)器

三、注釋

????????用 // 注釋單獨(dú)的一行,用 /* */ 注釋多行。注釋的內(nèi)容不要冗長(zhǎng)。

四、模塊

? ? ? ? 模塊的例化名要做到統(tǒng)一,且有規(guī)律可循。IP 核的例化也是一樣。

? ? ? ? 一條語句占一行。

? ? ? ? 模塊的接口信號(hào)按照輸入(input)、雙端口(inout)、輸出(output)的順序定義。

? ? ? ? 多bit信號(hào)定義按照【width-1:0】的方式定義。

? ? ? ? 不能用向量方式定義一組時(shí)鐘信號(hào)。如 input? ?[2:0]? ?CLK

? ? ? ? module內(nèi)不能存在無驅(qū)動(dòng)源的多余信號(hào),也不能存在無驅(qū)動(dòng)的輸出信號(hào)。

? ? ? ? 頂層模塊中,除了例化模塊和它們之間彼此的連線,避免出現(xiàn)其他的邏輯。

? ? ? ? 子模塊的輸出建議用寄存器輸出。

? ? ? ? 子模塊內(nèi)避免雙向端口(inout),最好在頂層模塊處理雙向總線。

? ? ? ? 子模塊內(nèi)禁止用三態(tài)邏輯(除非子模塊的三態(tài)邏輯輸出直接供頂層模塊使用),頂層模塊可以用三態(tài)邏輯。

? ? ? ? 模塊內(nèi)避免存在未連接的端口。

? ? ? ? 為邏輯升級(jí)等準(zhǔn)備的端口、信號(hào),現(xiàn)階段先注釋掉。

五、wire、reg

? ? ? ? 禁止鎖存器和觸發(fā)器在不同的always塊中被賦值,形成多重驅(qū)動(dòng)。

? ? ? ? always 語句實(shí)現(xiàn)時(shí)序邏輯用 非阻塞賦值語句,實(shí)現(xiàn)組合邏輯用 阻塞賦值語句。同一種信號(hào)的賦值不能既是阻塞賦值 又是 非阻塞賦值。

? ? ? ? 所定義的wire 、 reg 類型的信號(hào)不能未使用。

? ? ? ? 建議不要使用 integer 類型的寄存器。

? ? ? ? 寄存器類型(reg)的信號(hào)要初始化。

? ? ? ? 除了移位寄存器,一個(gè)always語句塊中只對(duì)一個(gè)信號(hào)賦值、運(yùn)算。?

六、表達(dá)式

? ? ? ? 表達(dá)式內(nèi)多用小括號(hào)()表示運(yùn)算優(yōu)先級(jí)。

? ? ? ? 設(shè)計(jì)中用到的邏輯電平值用基數(shù)表示。如:1’b0、8‘b0101_1111、16’hA89B

? ? ? ? 進(jìn)行端口聲明、信號(hào)賦值、變量比較時(shí),一定注意位寬匹配。

七、條件語句

? ? ? ? if 、 else if 語句要有 else 語句與之相對(duì)應(yīng)。

? ? ? ? case 語句要有default。

? ? ? ? if 語句的條件表達(dá)式不能是常數(shù)。

????????不建議5級(jí)以上的 if-else 嵌套。

? ? ? ? 條件表達(dá)式必須為 1 bit 。如:

// 異步復(fù)位信號(hào) 低電平有效 if (I_ARst_n == 1'b0) // 不建議的寫法: if (I_ARst_n == 0) if (!I_ARst_n)

八、可綜合性

? ? ? ? 避免使用 include 語句;

? ? ? ? 應(yīng)采用復(fù)位方式初始化,仿真時(shí)可用 initial 語句初始化;

? ? ? ? 不要使用 specify 模塊;

? ? ? ? 不要使用 === 、!== 等不可綜合的操作符;

? ? ? ? 除仿真外不要使用 fork-join 語句、while 語句、repeat 語句、forever 語句、force 語句、release語句、named events 語句、系統(tǒng)任務(wù)($);

? ? ? ? 不能在連續(xù)賦值語句中引入 驅(qū)動(dòng)強(qiáng)度 和 延時(shí);

? ? ? ? 禁止用 trireg 型線網(wǎng);

? ? ? ? 禁止用tri1、tri0、triand、trior、型連接;

? ? ? ? 禁止位驅(qū)動(dòng)型(supply0、supply1)線網(wǎng)賦值;

? ? ? ? 禁止在RTL代碼中實(shí)例化門級(jí)單元,如:CMOS/RCMOS/NMOS/PMOS/RNMOS/RPMOS

/trans/rtrans/tranif0/tranif1

九、可重用性

? ? ? ? 進(jìn)口信號(hào)盡量少,接口時(shí)序盡量簡(jiǎn)單;

? ? ? ? 將狀態(tài)機(jī)電路與其他電路分開,異步電路與同步電路分開,便于后續(xù)的綜合、約束;

? ? ? ? 頂層模塊中將 I/O 端口、邊界測(cè)試電路、邏輯設(shè)計(jì)相區(qū)分;

十、同步設(shè)計(jì)

? ? ? ? 同一個(gè)模塊內(nèi),時(shí)序電路應(yīng)在時(shí)鐘的同一個(gè)邊沿動(dòng)作。如果有的部分需要用到上升沿而有的部分需要用到下降沿,那么就要用兩個(gè)模塊來設(shè)計(jì)。

? ? ? ? 頂層模塊中,時(shí)鐘信號(hào)必須可見,不要再模塊內(nèi)部生成時(shí)鐘信號(hào)。要用PLL/MMCM等生成。

? ? ? ? 避免使用門控時(shí)鐘、門控復(fù)位。

? ? ? ? 對(duì)于同步復(fù)位電路,建議在同一時(shí)鐘域使用單一的全局同步復(fù)位電路;對(duì)于異步復(fù)位電路,建議使用單一全局異步復(fù)位電路。

? ? ? ? 不要在時(shí)鐘、復(fù)位路徑上添加任何 buffer。

? ? ? ? 避免使用latch(鎖存器)。

? ? ? ? 寄存器的異步復(fù)位和置位不能同時(shí)有效。

? ? ? ? 避免使用組合反饋邏輯。

? ? ? ? 復(fù)雜電路將組合邏輯和時(shí)序邏輯分成獨(dú)立的 always 塊描述。

十一、循環(huán)語句

? ? ? ? 不建議使用循環(huán)語句,必要時(shí)可用 for 語句。

十二、約束

? ? ? ? 對(duì)全部的時(shí)鐘頻率、占空比進(jìn)行約束。

? ? ? ? 對(duì)全局時(shí)鐘的 skew 進(jìn)行約束。

? ? ? ? 根據(jù)輸入輸出信號(hào)特性進(jìn)行上下拉約束。

? ? ? ? 綜合設(shè)置,建議將 fanout 設(shè)置為30。

? ? ? ? 布局布線報(bào)告中 IOB、LUTs、RAM等資源利用率低于80%。

十三、PLL、DCM

? ? ? ? 使用FPGA內(nèi)部PLL/DCM資源時(shí),應(yīng)保證輸入時(shí)鐘抖動(dòng)小于300ps,以防止失鎖。

? ? ? ? 輸入時(shí)鐘出現(xiàn)瞬斷,必須復(fù)位PLL/DCM。

十四、關(guān)于對(duì)齊

? ? ? ? 代碼對(duì)齊用空格,盡量不用 Tab 。


參考聲明

【1】Verilog 紅寶書編程規(guī)范。

【2】Verilog 編程規(guī)范。?

歡迎提出寶貴意見~



文末推薦

掌握了基本的Verilog語法,不去實(shí)戰(zhàn)練習(xí)的話很難有大的突破。牛客網(wǎng)可以為大家提供一個(gè)免費(fèi)的刷題練習(xí)的平臺(tái)。非常推薦大家使用。

?鏈接如下:牛客網(wǎng)-Verilog專項(xiàng)https://www.nowcoder.com/link/pc_csdncpt_zls_verilog這個(gè)里面有很多代碼題目練習(xí),對(duì)于新手來說可以快速掌握Verilog編程的基本語法,對(duì)于老手來說也可以鞏固自己的編程能力。不用付費(fèi)免費(fèi)試用哦。基本是每個(gè)即將找工作的人必備的刷題網(wǎng)站。快行動(dòng)起來吧!

總結(jié)

以上是生活随笔為你收集整理的Verilog HDL 编程规范的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。