Verilog HDL 编程规范
文章目錄
目錄
前言
一、文件聲明
二、命名
三、注釋
四、模塊
五、wire、reg
六、表達式
七、條件語句
八、可綜合性
九、可重用性
十、同步設計
十一、循環語句
十二、約束
十三、PLL、DCM
十四、關于對齊
參考聲明
前言
????????本專欄的博文都是關于Verilog HDL 語法。目前(2021/9/7),本人接觸FPGA和Verilog HDL 語法也差不多有近半年的時間了。對于一些常規的模塊編寫、IP核配置、仿真等沒有太大問題。但是如果涉及到特別復雜的邏輯設計時,也會出現較多的語法空白需要填補。所以我準備以博客的形式重新整理相關的Verilog HDL 語法,做到知識的沉淀。
????????有很多從事FPGA數字設計的人都說過,掌握Verilog HDL 的基礎語法就能夠編寫將近90%的邏輯,盡管事實確實如此。但是全面一些我覺得會更好。因為設計的正確性和最優性是兩個不同的概念。掌握基本的語法足夠讓你做到正確性,但是要想做到最優設計,必須要對語法有比較全面、透徹的認識。
????????Verilog HDL 編程風格和編程規范程度都很重要。規范的編程不僅是有助于自己排錯查錯,也利于別人理解。盡量在初學階段就逐漸形成自己規范的編程風格。
????????本文主要介紹一種規范的編程方式,供借鑒。
一、文件聲明
每個文件的開始,最好有說明該文件的文字段。主要包括:
1、公司、版權
2、文件名
3、作者
4、日期
5、版本號
6、概述(此部分包括模塊的功能描述、注意事項、關鍵點等)
如果后期對該模塊進行版本修改、升級、維護等,在原本的聲明文字后再添加對應版本修改信息。方便后期整理維護。
文件聲明具體格式參考:
//----------------文件的相關說明-------------------//// 公司版權:// 文件名稱: // 功能說明:// 作 者: // 設計日期: // 版 本:// 相關參考://----------------- 版 本 修 改--------------------//// 改后版本: // 修改日期: // 修改作者:// 修改原因:二、命名
1、模塊(module)命名
? ? ? ? 一個 Verilog 文件只能包含一個?module ,module 的名稱統一小寫或者大寫。盡量不要大小寫混著用。因為大小寫切換麻煩。這只是命名,不是設置密碼,模塊(module)的名稱要能夠有一定的功能、參數代表性。要做到見名識義。
2、parameter 命名
? ? ? ? 參數 parameter 的命名統一大寫。本地參數 localparam 也統一用大寫命名。建議用 parameter 、localparam 參數類型命名一些諸如數據位寬、版本號、狀態值等有意義的常數,方便程序改版升級。
3、信號命名
? ? ? ? 輸入信號、輸出信號、內部信號等的命名同一大寫或者小寫,不要混合使用(除了復位信號)。信號名稱最好能見名識義。最好在信號名稱最前面添加信號性質或者類型標識,方便使用。信號名稱不應過長(盡量小于20個字符)。信號名稱縮寫要有一定的通用性,不能過于生僻。
? ? ? ? 命名舉例:
input I_SYS_CLK, //系統時鐘 input I_ARst_n, //異步復位信號 低電平有效 input I_Rst_n, //同步復位信號 低電平有效 input I_ARst, //異步復位信號 高電平有效 input [15:0] I_FFT_DATA_RE,//FFT計算輸入數據實部 input [15:0] I_FFT_DATA_IM,//FFT計算輸入數據虛部output [15:0] O_FFT_RES_RE,//FFT計算結果實部 output [15:0] O_FFT_RES_IM,//FFT計算結果虛部 output O_VALID, //輸出有效信號wire W_READ_FLAG;//讀標志信號 wire [11:0] W_FIR_RES; //FIR濾波器輸出結果reg R_1_VALID; //valid 信號打一拍 reg R_2_VALID; //valid 信號打二拍 reg [15:0] R_COUNTER; //計數器三、注釋
????????用 // 注釋單獨的一行,用 /* */ 注釋多行。注釋的內容不要冗長。
四、模塊
? ? ? ? 模塊的例化名要做到統一,且有規律可循。IP 核的例化也是一樣。
? ? ? ? 一條語句占一行。
? ? ? ? 模塊的接口信號按照輸入(input)、雙端口(inout)、輸出(output)的順序定義。
? ? ? ? 多bit信號定義按照【width-1:0】的方式定義。
? ? ? ? 不能用向量方式定義一組時鐘信號。如 input? ?[2:0]? ?CLK
? ? ? ? module內不能存在無驅動源的多余信號,也不能存在無驅動的輸出信號。
? ? ? ? 頂層模塊中,除了例化模塊和它們之間彼此的連線,避免出現其他的邏輯。
? ? ? ? 子模塊的輸出建議用寄存器輸出。
? ? ? ? 子模塊內避免雙向端口(inout),最好在頂層模塊處理雙向總線。
? ? ? ? 子模塊內禁止用三態邏輯(除非子模塊的三態邏輯輸出直接供頂層模塊使用),頂層模塊可以用三態邏輯。
? ? ? ? 模塊內避免存在未連接的端口。
? ? ? ? 為邏輯升級等準備的端口、信號,現階段先注釋掉。
五、wire、reg
? ? ? ? 禁止鎖存器和觸發器在不同的always塊中被賦值,形成多重驅動。
? ? ? ? always 語句實現時序邏輯用 非阻塞賦值語句,實現組合邏輯用 阻塞賦值語句。同一種信號的賦值不能既是阻塞賦值 又是 非阻塞賦值。
? ? ? ? 所定義的wire 、 reg 類型的信號不能未使用。
? ? ? ? 建議不要使用 integer 類型的寄存器。
? ? ? ? 寄存器類型(reg)的信號要初始化。
? ? ? ? 除了移位寄存器,一個always語句塊中只對一個信號賦值、運算。?
六、表達式
? ? ? ? 表達式內多用小括號()表示運算優先級。
? ? ? ? 設計中用到的邏輯電平值用基數表示。如:1’b0、8‘b0101_1111、16’hA89B
? ? ? ? 進行端口聲明、信號賦值、變量比較時,一定注意位寬匹配。
七、條件語句
? ? ? ? if 、 else if 語句要有 else 語句與之相對應。
? ? ? ? case 語句要有default。
? ? ? ? if 語句的條件表達式不能是常數。
????????不建議5級以上的 if-else 嵌套。
? ? ? ? 條件表達式必須為 1 bit 。如:
// 異步復位信號 低電平有效 if (I_ARst_n == 1'b0) // 不建議的寫法: if (I_ARst_n == 0) if (!I_ARst_n)八、可綜合性
? ? ? ? 避免使用 include 語句;
? ? ? ? 應采用復位方式初始化,仿真時可用 initial 語句初始化;
? ? ? ? 不要使用 specify 模塊;
? ? ? ? 不要使用 === 、!== 等不可綜合的操作符;
? ? ? ? 除仿真外不要使用 fork-join 語句、while 語句、repeat 語句、forever 語句、force 語句、release語句、named events 語句、系統任務($);
? ? ? ? 不能在連續賦值語句中引入 驅動強度 和 延時;
? ? ? ? 禁止用 trireg 型線網;
? ? ? ? 禁止用tri1、tri0、triand、trior、型連接;
? ? ? ? 禁止位驅動型(supply0、supply1)線網賦值;
? ? ? ? 禁止在RTL代碼中實例化門級單元,如:CMOS/RCMOS/NMOS/PMOS/RNMOS/RPMOS
/trans/rtrans/tranif0/tranif1
九、可重用性
? ? ? ? 進口信號盡量少,接口時序盡量簡單;
? ? ? ? 將狀態機電路與其他電路分開,異步電路與同步電路分開,便于后續的綜合、約束;
? ? ? ? 頂層模塊中將 I/O 端口、邊界測試電路、邏輯設計相區分;
十、同步設計
? ? ? ? 同一個模塊內,時序電路應在時鐘的同一個邊沿動作。如果有的部分需要用到上升沿而有的部分需要用到下降沿,那么就要用兩個模塊來設計。
? ? ? ? 頂層模塊中,時鐘信號必須可見,不要再模塊內部生成時鐘信號。要用PLL/MMCM等生成。
? ? ? ? 避免使用門控時鐘、門控復位。
? ? ? ? 對于同步復位電路,建議在同一時鐘域使用單一的全局同步復位電路;對于異步復位電路,建議使用單一全局異步復位電路。
? ? ? ? 不要在時鐘、復位路徑上添加任何 buffer。
? ? ? ? 避免使用latch(鎖存器)。
? ? ? ? 寄存器的異步復位和置位不能同時有效。
? ? ? ? 避免使用組合反饋邏輯。
? ? ? ? 復雜電路將組合邏輯和時序邏輯分成獨立的 always 塊描述。
十一、循環語句
? ? ? ? 不建議使用循環語句,必要時可用 for 語句。
十二、約束
? ? ? ? 對全部的時鐘頻率、占空比進行約束。
? ? ? ? 對全局時鐘的 skew 進行約束。
? ? ? ? 根據輸入輸出信號特性進行上下拉約束。
? ? ? ? 綜合設置,建議將 fanout 設置為30。
? ? ? ? 布局布線報告中 IOB、LUTs、RAM等資源利用率低于80%。
十三、PLL、DCM
? ? ? ? 使用FPGA內部PLL/DCM資源時,應保證輸入時鐘抖動小于300ps,以防止失鎖。
? ? ? ? 輸入時鐘出現瞬斷,必須復位PLL/DCM。
十四、關于對齊
? ? ? ? 代碼對齊用空格,盡量不用 Tab 。
參考聲明
【1】Verilog 紅寶書編程規范。
【2】Verilog 編程規范。?
歡迎提出寶貴意見~
文末推薦
掌握了基本的Verilog語法,不去實戰練習的話很難有大的突破。牛客網可以為大家提供一個免費的刷題練習的平臺。非常推薦大家使用。
?鏈接如下:牛客網-Verilog專項https://www.nowcoder.com/link/pc_csdncpt_zls_verilog這個里面有很多代碼題目練習,對于新手來說可以快速掌握Verilog編程的基本語法,對于老手來說也可以鞏固自己的編程能力。不用付費免費試用哦。基本是每個即將找工作的人必備的刷題網站。快行動起來吧!
總結
以上是生活随笔為你收集整理的Verilog HDL 编程规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双目摄像头立体成像(二)畸变矫正与立体校
- 下一篇: AMCL介绍