1.parameter
在例化多个相同模块但每个模块需要不同参数时常常会使用。
// para 模块
module para(
input clk,
input rst,
input [WA-1:0] a,
input [WB-1:0] b,
output reg [WS-1:0] sum
);
parameter WA = 1;
parameter WB = 1;
parameter WS = 2;
always @(posedge clk)
begin
if(rst)
sum <= 0;
else
sum <= a + b;
end
endmodule
模块para中使用parameter定义了三个常量 WA=1、 W=1、 WS=2 来指出 a、b 和sum 的位宽。
// 顶层例化调用
module top(
input clk,
input rst,
input [4:0] m,
input [5:0] n,
output [6:0] res
);
reg [5:0] a;
reg [6:0] b;
wire [6:0] sum;
always @(posedge clk)
begin
if(rst)
a <= 6'd0;
else
a <= n - m;
end
always @(posedge clk)
begin
if(rst)
b <= 7'd0;
else
b <= m + n;
end
para #(
.WA(6), //重新定义常量 WA 的值为 6
.WB(7),
.WS(7)
)para1(
.clk(clk),
.rst(rst),
.a(a),
.b(b),
.sum(res)
);
endmodule
para 模块在例化时通过 # 对模块中的常量进行了重新定义。
// 仿真验证
`timescale 1ns / 1ps
module para_tb(
);
reg clk;
reg rst;
reg [4:0] m;
reg [5:0] n;
wire [6:0] res;
initial begin
m <= 5'b10001;
n <= 6'b100101;
end
top top_tb(
.clk(clk),
.rst(rst),
.m(m),
.n(n),
.res(res)
);
parameter CLK_PERIOD = 10;
initial begin
clk = 1;
forever begin
#(CLK_PERIOD/2)
clk = ~clk;
end
end
initial begin
rst = 0;
#CLK_PERIOD
rst = 1;
#CLK_PERIOD
rst = 0;
end
endmodule
仿真结果:
可以看出a、 b、 sum 的位宽 WA WB WS 由原来模块中的 1、1、2 重新定义成了 6、7、7。
2.generate
geberate for、generate if、generate case示例:
module top
#(parameter integer flag = 0)
(
input clk_sys,
input [7:0] a,
input [7:0] b,
output [7:0] c,
output reg [7:0] ab_xor,
output reg [8:0] ab_ad
);
genvar i;
generate for(i=0;i<8;i=i+1) begin: ab_xor_gen
always @(posedge clk_sys)
ab_xor[i] <= a[i] + b[i];
end
endgenerate
generate if(flag==0) begin:add
always @(posedge clk_sys)
ab_ad <= a + b;
end else begin:subsrtact
always @(posedge clk_sys)
ab_ad <= a - b;
end
endgenerate
generate
case(flag)
0:
assign c = a;
1:
assign c = a + 1'b1;
default:
assign c = b;
endcase
endgenerate
endmodule
仿真
`timescale 1ns / 1ps
module tb_temp();
reg clk_sys;
reg [7:0] a;
reg [7:0] b;
wire [7:0] c;
wire [7:0] ab_xor;
wire [8:0] ab_ad;
initial begin
clk_sys = 1'b1;
forever begin
#5;
clk_sys = 1'b0;
#5;
clk_sys = 1'b1;
end
end
initial begin
a = 8'b10010011;
b = 8'b00110011;
end
top #(
.flag (1)
)
top_inst(
.clk_sys (clk_sys),
.a (a),
.b (b),
.c (c),
.ab_xor (ab_xor),
.ab_ad (ab_ad)
);
endmodule
仿真结果: