1.define,是宏定义,全局有效。则在整个工程都是有效
2.parameter,参数,可以由调用者修改参数值。在定义模块和例化的时候有一定的差别,在定义模块时:模块名在参数的前面;例化模块时:参数在实例化名的前面
简单举例:
定义模块
module clkgen
#(
parameter COUNT=4'd15
)
(
input clk,
output clk_en
#(
parameter COUNT=4'd15
)
(
input clk,
output clk_en
);
reg [3:0] cnt=4'd0;
always@(posedge clk)
begin
if(cnt<COUNT)
cnt<=cnt+1'b1;
else
cnt<=4'd0;
begin
if(cnt<COUNT)
cnt<=cnt+1'b1;
else
cnt<=4'd0;
end
assign clk_en=(cnt==COUNT)?1'b1:1'b0;
endmodule
例化时:
`timescale 1ns/1ns
module clkgen_tb;
reg clk;
wire clk_en;
wire clk_en;
clkgen
#(
.COUNT(15)
)
u_clkgen
(
.clk(clk),
.clk_en(clk_en)
#(
.COUNT(15)
)
u_clkgen
(
.clk(clk),
.clk_en(clk_en)
);
initial
begin
clk=0;
begin
clk=0;
end
always #5 clk=~clk;
endmodule
3.localparam,本地参数,调用者不可修改。