一、parameter 声明常量
parameter定义常量,可以在模块内部或外部;常用于定义位宽或时间延迟(一些易变的量)
定义方式为:parameter 标识符 = (位宽) 常数;//位宽默认为32位,如果指定位宽则以指定值为准
1.1 parameter 在模块内部定义常量
module param_interior(
input clk,
input rst_n,
input [2:0] din,
output reg [3:0] sum
);
parameter add=2'd1;
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b'0)
begin
sum<=4'd0;
end
else
begin
sum<=din+add;
end
end
endmodule
1.2 parameter 在模块外部定义常量
module param_exterior
#( parameter add=2'd1)
(
input clk,
input rst_n,
input [2:0] din,
output reg [3:0] sum
);
always@(posedge clk or negedge rst_n)
if(rst_n==1'b'0)
begin
begin
sum<=4'd0;
end
else
begin
sum<=din+add;
end
end
endmodule
1.3 使用parameter定义常量的好处
1.3.1 可维护性
通过改变parameter定义的常量值,实现代码所有用到这一标志符的值,便于修改与维护。
1.3.2 可读性
标志符按照常量实际意义取名,增强可读性
二、参数传递
子模块利用parameter定义常量,被顶层调用时默认子模块中的参数
module Decode(A,F);//这是一个子模块
parameter Width=1,Polarity=1;
…
endmodule
2.1 模块调用修改参数
参数改变时,可在顶层模块调用子模块时进行参数修改;
如:
module Top(…); //这是一个顶层模块
Decode #(4,0) U1(); //使得Width=4,Polarity=0;
Decode #(5)U2(); //使得Width=5,Polarity不变,即为1
endmodule
2.2 利用defparam修改参数
参数修改时,也可以利用defparam进行参数修改;
如:
module Top(…); //这是一个顶层模块
defparam U1.Width=4;
defparam U1.Polarity=0;//使得Width=4,Polarity=0;
defparam U2.Width=5;//使得Width=5,Polarity不变,即为1
Decode U1();
Decode U2();
endmodule