1. verilog 带参数例化
当一个模块被另一个模块引用例化时,高层模块可以对低层次模块的参数值进行改写。
2. defparam
可以用关键字 defaram
通过模块层次调用的方法,来改写低层次模块的参数值。
示例如下
verilog
defparam u_ram.MASK = 7 ;
ram u_ram(
.clk (clk) ,
.a (a ) ,
.d (d ) ,
.en (en ) ,
.wr (wr ) ,
.q (q )
);
/// 此模块的MAKSK已经被上层模块传参为7
module ram #(
parameter MASK = 3
)(
input wire clk ,
input wire [7:0] a ,
input wire [7:0] d ,
input wire en ,
input wire wr ,
output reg [7:0] q
);
reg [7:0] mem [0:(1<<7)-1] ;
always @(posedge clk) begin
if(en && wr) begin
mem[a] <= d & mask ;
end
else if(en && !wr) begin
q <= mem[a] & mask ;
end
end
endmodule
3. 带参数模块例化
示例如下
verilog
ram #(
.aw(4) ,
.dw(4)
)
u_ram(
.clk (clk ) ,
.a (a[aw-1:0] ) ,
.d (d ) ,
.en (en ) ,
.wr (wr ) ,
.q (q )
);
/// 此模块下的aw,dw都被上层模块传参为4
module ram #(
parameter aw = 2 ,
parameter dw = 3
(
input wire clk ,
input wire [aw-1:0] a , /// 现在a的位宽为3,原始为1
input wire [dw-1:0] d , /// 现在b的位宽为3,原始为2
input wire en ,
input wire wr ,
output reg [dw-1:0] q
);
...
...
...
endmodule
笔记
实际工作中,带参数例化的情况较多。