來源:數字邏輯與Verilog設計實驗課講解,個人做的筆記與整理。
00 規范的重要性
-
良好的編程風格有利於減少消耗的硬件資源,提高設計的工作頻率 。
-
提高系統的可移植性和可維護性。
-
程序的格式化能體現程序員的基本素質和整個團隊的風貌。
01 命名規則
有C語言基礎的這部分可以簡單略過,看看即可。無基礎的可以跳過,有一定編程經驗后再來總結提高。
01-00 命名字符集
用於命名的字符集為:字母A~Z和a~z, 數字0~9以及下划線組成。
例如:
1 data_bus 2 data_width 3 clk_48M 4 //使用用意義的名字,利於望文生義,便於維護 5 6 48M_clk//名稱不能以數字開頭 7 data__bus//不能連續使用下划線 8 data*bus//不能包含非字母符號
01-01 命名大小寫規則
-
參數(parameter)、常量(constant)和塊標號(block label)名必須一致采用大寫;
-
而信號,變量和結構名(construct)以及實例標號(instance)必須一致采用小寫。
-
有利於在仿真時,區分不變和變化的 數據。
例子:
1 module display_led( //模塊標號小寫 2 clk_48M, //時鍾 3 ledout //LED輸出 4 ); 5 input clk_48M; //48M系統時鍾 6 output [7:0]ledout;//LED輸出控制 7 reg [22:0]count; //計數器 8 reg [7:0]led_reg; //LED輸出緩存區 9 wire led_clk; //LED顯示時鍾控制 10 parameter COUNTER=100; 11 assign led_clk = count[22]; //LED顯示時間控制
01-02 名字必須唯一
在不區分大小寫的情況下,名字必須唯一。例如,名字state和State不能同時出現在同一設計中。因為有的EDA工具不區分大小寫。
01-03 不同類型的信號的命名習慣
-
如果一個名字由多個字組成,則使用下划線連接,用以增加名字的可讀性。
-
為了使信號的名字有意義,可以根據信號類型選取相應的后綴。
具體示例如下:
命名 | 信號類型 | 實例 |
---|---|---|
xx_r | 寄存器類型 | Data_out_r |
xx_a | 異步信號 | Addr_strobe_a |
xx_clk | 時鍾信號 | Sys_clk |
xx_nc | 不連續信號 | Stata_nc |
xx_n | 低電平有效信號 | Reset_n |
xx_pn | 有n個相位的信號 | Enable_p2 |
xx_z | 三態信號 | Data_out_z |
xx_next | 狀態機信號 | Transmit_next |
xx_test | 測試模式信號 | Parallel_clk_test |
sys_xxx | 系統信號 | sys_dout,sys_din |
clk_xxx | 時鍾信號(也可這樣寫) | clk_768MHZ |
rst_xxx reset_xxx | 復位信號 | |
st_xxx set_xxx | 置位信號 |
01-04 多后綴的優先權
這個確實有點抽象...
順序:
1 //例子 2 ram_1_clk_z_n 3 //結構 4 操作對象序號_數據類型(_clk/_next)_三態信號(_z)_低電平有效信號(_n)
01-05 模塊命名習慣
-
將模塊英文名稱的各個單詞的首字母組合起來,形成3~5個符號的縮寫。
Arithmatic logical unit —— ALU
-
若模塊的英文名只有一個單詞,可取該單詞的前3個字母
Decider —— DEC
01-06 模塊間接口命名
-
所有的變量命名分為兩個部分:
-
第一部分表明數據方向,其中數據發出方在前,數據接收方在后;
-
第一部分全部大寫,
-
-
第二部分為數據名稱。
-
第二部分中所有具有明確意義的英文名全部拼寫或者縮寫的第一個字母大寫,其余部分小寫。
-
-
兩個部分用下划線隔離開。
-
-
例:CPUMMU_WrReq (CPU發送給MMU的寫請求信號)
01-07 模塊內部信號
模塊內部的信號由幾個單詞連接而成,縮寫要求能基本表明本單詞的含義。
02 注釋
主要有三點:
-
普通描述注釋“//”就可以
-
文件頭注釋有一點麻煩,但是顯得很標准。
-
模塊之間(always)的注釋參照文件頭注釋
1 //**************************************** 2 //模塊名稱: 3 //功能描述: 4 //****************************************
03 代碼格式
03-00 端口
1 module buzzer ( 2 clk_48M, //時鍾輸入 3 beep, //蜂鳴器控制輸出 4 key, //按鍵輸入 5 ledout //LED顯示控制信號 6 ); 7 //個人感覺對於復雜電路比較有用,而實驗代碼就不必如此,直接類似函數參數一樣聲明即可。可配注釋理解。
03-01 連線
1 input clk_48M; 2 input rst; 3 output lcd_en; 4 output [7:0]data_bus; 5 wire clk_lcd; 6 //緊跟module聲明,一個Tab鍵 7 //標准要求是一行聲明一個端口
03-02 正文
正文書寫要求與C語言類似。
03-03 其他
-
用四個空格代替TAB鍵;因為不同的編輯系統的Tab制表符間距可能不同。
-
每行只有一個Verilog語句;對於長的語句可以使用回車和縮進方法,表示成連續的語句行。
-
避免使用硬編碼;建議使用宏或則參數來定義常數,避免使用硬編碼數值。例如:
1 //硬編碼方式: 2 input [31:0] data_a; // 輸入比較數據A 3 input [31:0] data_b; // 輸入比較數據B 4 5 //參數定義方式: 6 parameter DATA_WIDTH = 32; //總線數據寬度 7 input [DATA_WIDTH-1:0] data_a; 8 // 輸入比較數據A 9 input [DATA_WIDTH-1:0] data_b; 10 // 輸入比較數據B
下面是更多出於美觀的考慮:
-
各節之間加1行或者多行空格
-
不同變量,變量與符號,變量與括號之間都應該保留一個空格 alwaya @ ( … )
-
邏輯運算符、算術運算符、比較運算符等運算符兩側各留一個空格。(單數操作運算符例外)
-
使用”//” 注釋時,在”//”后應當有一個空格