Verilog標準手冊閱讀筆記
引言
該文章不適用于Verilog入學
Verilog標準手冊下載地址:
Verilog標準手冊
簡介
基本元件模塊:邏輯門和用戶定義的原語模塊(UDPs)
NET:表示電路連線或是總線的網絡
寄存器:可以作為輸入信號連接到某個具體模塊的輸入口
模塊中每個initial,always,連續賦值assign,UDP和各種邏輯門結構塊都是并行執行
代碼編寫標準
語匯代碼
目的: 提高可讀性和可維護性
要求:
-
每個Verilog源文件中只準編寫一個模塊,每個模塊只能使用一個源文件
-
源文件的名字應該與內容相關(
其實EDA一般都會強制要求模塊名和源文件名相同) -
每行只寫一個聲明語句或說明,同時需要使用縮進
-
變量的定義要做到見名知意,且保持統一的命名風格
-
編寫模塊的接口注釋,指明接口的格式和功能
-
減少
硬編碼,多使用參數和宏定義
可綜合代碼
目的: 避免不可綜合
要求:
-
按照功能進行模塊分割,同時,使用行為風格去設計功能塊,盡可能避免使用門級描述
-
建立一個定義良好的時鐘策略,并在Verilog源代碼中清晰地體現該策略,保證時鐘和復位信號是干凈的,即不會由其他組合電路產生該信號
-
建立一個定義良好的測試策略,使所有的觸發器都是可復位的
-
描述組合和鎖存邏輯的
always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號 (一般的EDA工具對這條規則是默) -
所有的輸出變量必須被各輸入值的組合賦值
-
在
always塊中已被定義為輸出的寄存器變量絕對不能再在該always中讀進來作為輸入信號 -
時鐘沿觸發的
always塊必須是單時鐘,并且任何異步控制輸入必須在控制事件列表中列出來 -
避免生成額外的鎖存器
在無時鐘的always塊中,由于有的輸出變量被賦了某個信號變量值,而該信號變量沒在該always塊的電平敏感控制事件中列出,這會在綜合中生成不想要的鎖存器。
- 避免生成額外的觸發器
在時鐘沿觸發的always 塊中,用非阻塞的賦值語句對寄存器類型的變量賦值,綜合后就會生成觸發器;或者當寄存器類型的變量在時鐘沿觸發的always 塊中經過多次循環它的值仍保持不變,綜合后也會生成觸發器。
-
所有內部狀態寄存器必須是可復位的 (這并不適用于流水線或同步寄存器)
-
一般情況下,在賦值語句中不能使用延遲,使用延遲的賦值語句是不可綜合的
-
不要使用整型和time型寄存器,否則將分別綜合成32位和64位的總線。
-
仔細檢查Verilog代碼中使用動態指針,循環聲明或算術運算部分,因為這類代碼在綜合后會生成大量的門,而且很難進行優化
設計流程
1. 系統分析
2. 系統劃分
2.1 頂級模塊
2.2 模塊大小估計
2.3 預布局
3. 模塊級設計
3.1 編寫RTL級Verilog
3.2 綜合代碼檢查
3.3 寫Verilog測試文件
3.4 Verilog仿真
3.5 寫綜合約束,邊界條件,層次
3.6 預綜合以分析門的數量和延時
4. 芯片綜合
4.1 寫Verilog測試文件
4.2 Verilog仿真
4.3 綜合
4.4 門級仿真
5. 測試
6. 布局布線
7. 布局布線后的仿真測試
Verilog使用注意事項
always聲明語句
always @(inputs) begin
//組合邏輯
end
注意事項:
- 在
always塊中被賦值的只能是寄存器類型的變量 - 如果
always中沒有時間控制將會無限循環
assign 連續賦值聲明語句
當表達式中NET或寄存器類型變量的值發生變化時,使用assign可以在一個或更多的電路連接中創建事件
wire cout,cin;
wire[31:0] sum,a,b;
assign {cout,sum}=a+b+cin;
注意事項:
-
連續賦值語句必須放在
initial和always塊外 -
連續賦值語句將被綜合成為組合邏輯電路
begin聲明語句
- 在
begin-end模塊中至少要有一個聲明語句,同時聲明語句會被順序執行
case聲明語句
-
不確定值和高阻值在
case語句的表達式匹配中都代表“不必考慮” -
case中的賦值語句常常被綜合成多路器,如果變量被用作case語句的標號,它就會被綜合成優先編碼器 -
在一個無時鐘觸發的
always塊中,如有不完整的賦值,他將被綜合成透明鎖存器 -
在一個有時鐘觸發的
always塊中,如有不完整的賦值,他將被綜合成循環移位寄存器

浙公網安備 33010602011771號