参数传递
参数型数据
用parameter定义常量,格式:
parameter 参数名1=表达式,参数名2=表达式, 参数名 3=表达式;
参数型常数经常用于定义延迟时间和变量宽度。在模块或实例引用时,可通过参数传递改变在被引用模块或实例中已定义的参数。
module Decode(A,F);
parameter Widrh=1,Polarity=1;
//.......
endmodule
//调用带参数的模块
module Top;
wire [3:0] A4;
wire [4:0] A5;
wire [15:0] F16;
wire [31:0] F32;
Decode #(4,0) D1(A1,F14);
Decode #(5) D1(A5,F32);
endmodule
循环生成语句
循环生成语句允许使用者对下面的模块或模块项进行多次实例引用:
1、变量声明
2、模块
3、用户定义原句、门级原句
4、连续赋值语句
5、initial块和always块
例:多次引用一个门级语句
module bitwise_xor(
out,
i0,
i1
)
parameter N=32;
input [N-1:0]i0,i1;
output [N-1:0] out;
genvar j; //声明一个临时循环变量 ,在设计中该变量并不存在
generate
for(j=0 ; j<N ; j=j+1)
begin : xor_loop //xor_loop是赋予循环生成语句的名字
xor g1 (out[j],i0[j], i1[j]);
end
endgenerate
xor_loop是赋予循环生成语句的名字,目的在于通过它对循环生成语句之中的变量进行层次换引用,因此循环生成语句中各个异或门的对应层次名为:xor_loop[0].g1,xor_loop[1].g1,......,xor_loop[31].g1
例:多次引用一个模块
对一个BCD加法器进行100次调用,变成一个100位的BCD加法器,一位的BCD加法器的模块如下:
module bcd_fadd ( input [3:0] a, input [3:0] b, input cin, output cout, output [3:0] sum );
对其进行循环生成的语句如下:
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0] cin_temp;
wire [99:0] cout_temp;
assign cin_temp={cout_temp[98:0],cin};
assign cout=cout_temp[99];
genvar j; // genvar j; 声明一个临时循环变量 ,该变量只用于生成块循环计算
generate
for (j=0;j<100;j=j+1)
begin :add_loop //add_loop赋予循环变量生成的名字
bcd_fadd u_bcd_fadd(
.a(a[j*4+3:j*4]),
.b(b[j*4+3:j*4]),
.cin(cin_temp[j]),
.cout(cout_temp[j]),
.sum(sum[j*4+3:j*4])
);
end
endgenerate
endmodule
条件生成语句
条件生成语句类似于if_else_if 的生成构造,该构造可以在设计模块中根据经过仔细推敲并确定表达式,有条件地调用以下这些Verilog结构:
1、模块
2、用户定义原句、门级原句
3、连续赋值语句
4、initial块和always块
例:使用条件生成语句实现参数化的乘法器
module multiplier(
product,
ao,
a1
);
parameter a0_width=8;
parameter a1_width=8;
//本地参数声明,
localparam product_width = a0_width+a1_width;
output [product_width-1:0] product ;
input [a0_width-1 : 0] a0;
input [a1_width-1 : 0] a1;
//条件生成语句,有条件调用不同类型的乘法器
generate
if(a0_width < 8) || (a1_width < 8)
cal_multiplier #(a0_width,a1_width) m0 (product,ao,a1) //超前进位乘法器
else
tree_multiplier #(a0_width,a1_width) m0 (product,ao,a1) //树形乘法器
endgenerate
endmodule
case生成语句
case生成语句可以有条件地调用下面这些结构:
1、模块
2、用户定义原句、门级原句
3、连续赋值语句
4、initial块和always块
例:case生成语句调用不同位数的加法器
module adder(
co,
sum,
ao,
a1,
ci
);
parameter N=4;
output [N-1:0] sum;
input [N-1:0] ao,a1;
output co;
input ci;
//根据总线的位宽调用相应的加法器
generate
case(N)
1 : adder_1bit adder1(co,sum,ao,al,ci); //1位加法器
2 : adder_2bit adder1(co,sum,ao,al,ci); //2位加法器
default : adder_cla #(N) adder3(co,sum,ao,al,ci);
endcase
endgenerate
endmodule