- generate语句的概念:
生成语句主要用在对矢量、数组多个位或元素操作、连续assign赋值、重复例化模块等使用,主要是为了简化代码。 - 语法:
-
定义genvar,作为generate种的循环变量,可以在外面也可以在里面。
-
generate语句中定义的for语句,必须要有begin,为后续增加标签做准备。
-
begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。
-
可以使用在generate语句中的类型主要有:
module(模块)
UDP(用户自定义原语)
门级原语
连续赋值语句
initial或always语句 -
主要有三种语句:
// generate循环语句 for// generate 条件语句 if
// generate 分支语句 case
// 嵌套的generate语句
- generate在综合后本质上就是赋值了多个类似的电路,每个电路操作不同的数据,genvar i一般就是指重复的次数,在综合后该变量不在电路中出现。 举个例子:
assign:
module test(bin,gray);
parameter SIZE=3;
output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
genvar i; //genvar i也可以定义到generate语句里面
generate
for(i=0;i<SIZE;i=i+1)
begin:bit
assign bin[i]=^gray[SIZE-1:i];
end
endgenerate
endmodule
等同于下面语句
assign bin[0]=^gray[SIZE-1:0];
assign bin[1]=^gray[SIZE-1:1];
assign bin[2]=^gray[SIZE-1:2];
always:
generate
genvar i;
for(i=0;i<SIZE;i=i+1)
begin:shifter
always@(posedge clk)
shifter[i]<=(i==0)?din:shifter[i-1];
end
endgenerate
相当于
always@(posedge clk)
shifter[0]<=din;
always@(posedge clk)
shifter[1]<=shifter[0];
always@(posedge clk)
shifter[2]<=shifter[1];