Verilog中使用'include實現參數化設計

前段時間在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接口

相關文章
相關標籤/搜索