verilog 中parameter定义可以放在模块名后面,例如:
module u1 #(
parameter width = 1)(
clk,
a,
b
);
input clk;
input a;
output [width-1:0] b;
...
endmodule
module u2 #(
parameter width = 1)(
input clk,
input a,
output [width-1:0] b
);
...
endmodule
也可以放在模块端口声明后面,例如:
module u3 (
input clk,
input a,
output b
);
parameter width = 1;
...
endmodule
module u4 (
clk,
a,
b
);
input clk;
input a;
output [width-1:0] b;
parameter width = 1;
...
endmodule
模块的端口声明可以放在端口列表里,称为模块端口声明风格,例如u2,u3;
也可以放在模块内部,称为模块端口列表风格,例如u1,u4。
模块的参数也有两种声明风格:放在参数端口中声明,例如u1,u2;
放在模块内部声明,例如u3,u4。
u1,u2,u3,u4都可以在例化的时候,修改参数a的值。
有两种方法可以修改参数a的值:
-
使用定义参数语句(defparam)修改参数值
module top( input clk, input a, output [2:0]b ) defparam u1_inst.width = 3; u1 u1_inst( .clk(clk), .a(a), .b(b) ); endmodule
-
在模块实例引用中修改参数值
下面代码中对u1和u4的例化把u1和u4中的参数a的值修改成3.
module top( input clk, input a, output [2:0]b,c) u1 #(.width(3)) u1_inst( .clk(clk), .a(a), .b(b) ); u4 #(.width(3)) u4_inst( .clk(clk), .a(a), .b(c) ); endmodule
本文主要参考:《Verilog HDL入门》第三版,2019年由北京航空航天大学出版社出版。