前段時間在FPGA上用Verilog寫了一個多端口以太網的數據分發模塊,由於每一個網口須要獨立的MAC地址和IP地址,爲了便於後期修改,在設計中使用parameter來定義這些地址和數據總線的位寬等常量。
當時的作法是,頂層模塊和子模塊中都定義parameter型常數,在頂層模塊引用子模塊時,經過參數傳遞改變在被引用子模塊中已定義的參數,實如今頂層模塊統一管理參數的功能,代碼以下html
1 module top(); // 頂層模塊 2 parameter eth1_ip_addr = {8'd192, 8'd168, 8'd100, 8'd1}; // 以太網1 IP地址 192.168.100.1 3 parameter eth2_ip_addr = {8'd192, 8'd168, 8'd100, 8'd2}; // 以太網2 IP地址 192.168.100.2 4 5 // 子模塊1例化 6 sub1 7 #( .ip_addr(eth1_ip_addr) // 參數傳遞 8 ) 9 sub1_inst( ); //端口映射 10 11 // 子模塊2例化 12 sub2 13 #( .ip_addr(eth2_ip_addr) // 參數傳遞 14 ) 15 sub2_inst( ); //端口映射
子模塊1和2分別實現以太網1和2的收發功能,ip_addr爲各自的本地IP地址,經過參數傳遞將eth1_ip_addr和eth2_ip_addr的值分別傳遞給兩個子模塊的ip_addr常數。
不過上述方法的缺點在於:
1. 當子模塊的參數較多,而且要屢次實例化時,代碼會顯得較爲臃腫
2. 假如工程的層次有4層,某個參數只在第4層的模塊使用到,爲了實現將參數從頂層傳遞到第4層,第2層和第3層模塊的參數列表中必須包含該參數。
解決上述問題有兩種方法:
1. 使用defparam命令在頂層模塊對子模塊中的參數重定義,可是該方法一樣存在一個問題:改變已經實例化後的模塊中的參數,必須用英文小數點(.)表示層次邏輯關係,以下所示git
1 module top; 2 reg clk; 3 reg [0:4] in1; 4 reg [0:9] in2; 5 wire [0:4] o1; 6 wire [0:9] o2; 7 // 子模塊實例化 8 vdff m1 (o1, in1, clk); 9 vdff m2 (o2, in2, clk); 10 endmodule 11 // 子模塊定義 12 module vdff (out, in, clk); 13 parameter size = 1, delay = 1; 14 input [0:size-1] in; 15 input clk; 16 output [0:size-1] out; 17 reg [0:size-1] out; 18 19 always @(posedge clk) 20 # delay out = in; 21 endmodule 22 // 參數重定義模塊 23 module annotate; 24 defparam 25 top.m1.size = 5, // size參數的層次化表示 26 top.m1.delay = 10, 27 top.m2.size = 10, 28 top.m2.delay = 20; 29 endmodule
具體使用方法見http://www.cnblogs.com/hechengfei/p/4116667.html
2. 使用`inculude
預處理命令
最近在STM官網上找M95xxx系列的EEPROM資料時,看到該芯片的Verilog Testbench模塊,以下圖所示spa
M95XXX_Macro_Mux.v:定義M95xxx系列芯片的AC參數
M95XXX_Parameters.v:定義Memory大小、有效地址位數和Page大小等參數
M95xxx_Testbench.v:連接 M95xxx_Driver.v和M95xxx_Memory.v
M95xxx_Driver.v:模擬M95xxx_Memory.v文件基於SPI接口的讀寫行爲
M95xxx_Memory.v:M95xxx EEPROM的行爲級描述模型 設計
在上述文件中,M95XXX_Macro_Mux.v和M95XXX_Parameters.v定義了全局參數,被其餘文件經過’include命令包含到文件內。具體使用方法以下
M95XXX_Parameters.v 參數定義文件code
1 `define MEM_ADDR_BITS 11 //memory address bits 2 `define PAGE_ADDR_BITS 6 //page address bits
M95xxx_Driver.v 驅動文件htm
`include "M95XXX_Parameters.v" reg[`MEM_ADDR_BITS-1:0] memory_address; reg[`PAGE_ADDR_BITS-1:0] page_address;
能夠看到要調用參數文件中參數時,須要:
1. 使用'include
命令包含參數文件
2. 使用反引號+參數名的方式來調用該參數blog
STM MP95xxx系列EEPROM Verilog Testbench模型的連接地址:
https://gitee.com/hombeen/codes/y9rb0g7ej385sipqozvla95接口