模型功能
- module是verilog中層次劃分的基本單元
- 通過module之間的調用,可以實現硬件描述層次的提高
- 端口列表則是module的輸入輸出,和數字電路的走線連接等效
- 基于module的不斷地疊加,verilog可以完成從底層的與或門到復雜數字系統的逐步設計
模型框圖
//module define
module A#(
input i_clk
)(
);
//module application
B #(
.MD_SIM(1'b1)
)u_B(
.i_clk(i_clk)
);
endmodule
實現步驟
- 確認模塊的名稱
- 模塊名是調用該模塊的句柄,一個工程中不允許存在同一個模塊
- 但是如果是封裝為IP,采用OOC的綜合方式,則vivado是支持在不同IP中使用同樣命名的模塊
- 一般模塊的命名突出功能特點
- 比如硬件模塊BRAM、FIFO,總線轉接模塊AXISMART,測試激勵模塊tb_bram等
- 只要能一眼看出模塊的作用即可
- 確認模塊的參數列表
- 和C語言的函數的參數類似,verilog的模塊也是可以傳遞參數的
- 參數作為整個模塊的常數項,可以隨意插入而不用考慮時序問題,是模塊靈活通用的關鍵所在
- 一般位寬、硬件信息、延時大小等用戶參數,均需要通過參數列表進行傳遞
- 確認模塊的信號列表
- 與參數不同,信號的輸入輸出必須考慮到時序問題和方向問題
- 一般信號的輸入用于該模塊的控制和數據的輸入
- 而信號的輸出則是該模塊的標志位和數據的輸出
- 但是這個只是對于一般模塊級別的設計
- 更加復雜的系統會引入各種操作總線,利用通用協議,實現各種握手交互
- 所以
- 一個信號列表應該對信號輸入、信號輸出、總線交互三個部分進行明確的區分
- 才能具備很好的區分度和可維護性
- 模塊的調用方法
- 如前所示,模塊的調用同樣包括了參數部分和信號部分
- 其中參數部分可以缺省
- 信號部分輸出可以缺省,輸入缺省的話,則依賴編譯器的處理邏輯
- 比如vivado一般將缺省的輸入置零
- modelsim一般置為X
- generate在模塊調用中的應用
- 在C語言中,函數可以在for、if等結構中進行重復調用
- 而verilog中,所有硬件并行執行,無法實現在for中按照步驟執行
- 為了實現順序執行,常采用狀態機或者流水線去構建級聯的硬件
- 顯然,這種方法將會造成很大調用問題
- 在verilog中,實現級聯邏輯一般用generate for
- for的含義是將模塊多次重復,依靠級聯信號實現處理邏輯的步步執行
- 這個方法可以有效地解決模塊重復調用地問題
- 當然,可以使用generate if對某些模塊進行選擇性執行
- 但是,這里必須由常數對if的條件進行控制
- 也就是說,信號是無法控制模塊是否調用的
- 要實現類似C的兩個函數中選擇一個執行,verilog需要將判斷條件施加在輸出上
- 還有一個generate case,和if是類似的效果
generate genvar i;
for(i = 0; i < 3; i = i + 1)
begin:FOR_3
A u_A(
.i_clk(i_clk),
.i_dat1(3'h111),
.i_dat2(2'b11),
.i_dat3(1'b1)
);
end
endgenerate
- 如上所示
- 在for級聯邏輯中,位寬的匹配是一個比較重要的點
- 為了保證信號的準確性,位寬連接只存在兩種格式:
- 復制:輸入信號不大于端口位寬,則復制該信號到所有模塊
- 對齊:輸入信號位寬大于端口位寬,則將輸入信號對齊至N*端口位寬(高位補零),然后按名稱順序匹配
- 則示例中的三個數據結果為
- FOR_3[2].u_A.i_dat1 = 1'b1(對齊)
- FOR_3[1].u_A.i_dat2 = 1'b0(對齊)
- FOR_3[0].u_A.i_dat3 = 1'b1(復制)
- 所以,在使用generate for時,需要嚴格控制位寬,缺省位寬是不可取的,而直接寫整型,則會被認為是32位寬的數據進行對齊
最終效果


調用接口
- 示例模型,無調用接口
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:綠葉落秋風,專注FPGA技術分析和分享,轉載請注明原文鏈接:http://www.rzrgm.cn/electricdream/p/18095384,文中資源鏈接如下:
1. GITHUB開源倉庫
浙公網安備 33010602011771號