循环结构体允许使用类似for循环语句的语法来多次例化generate块。在循环方案中使用循环索引变量之前,应在genvar声明中定义该变量。
genvar在elaboration阶段作为整数使用,以评估生成循环的次数并创建generate块实例,但genvar在仿真或代码运行时并不存在。除了在循环方案中,genvar不得在其他地方使用。循环方案中的初始化赋值和迭代赋值都应赋值给同一个genvar。
在循环构造的generate块中,有一个隐式的 localparam 声明。这是一个整数参数,它的名称和类型与循环索引变量相同,在生成块的每个实例中,它的值都是索引变量在实例生成时的值。该参数可在generate块中任何地方使用,与integer类型值的普通参数一样。它可以用层级名称引用。
由于这个隐式 localparam 与 genvar 具有相同的名称,因此在循环generate块中对该名称的任何引用都是对 localparam 的引用,而不是对 genvar 的引用。因此,不能有两个或多个嵌套循环的generate块使用相同的 genvar。
循环结构体中的generate块可以命名,也可以不命名,它们可以只由一个条目组成,在这种情况下不需要用 begin/end 关键字包围。即使没有 begin/end 关键字,它仍然是一个generate块,与所有generate块一样,它在实例化时包含一个独立的作用域和一个新的层级结构。如果generate块被命名,它就是一个generate块实例数组的声明,数组中的索引值是 genvar 在elaboration过程中的值。下面举例说明循环generate块的使用方法:
例 1-合法和非法的generate循环示例:
module mod_a;
genvar i; // " generate ", " endgenerate " keywords are not required
for (i=0; i<5; i=i+1) begin :a
for (i=0; i<5; i=i+1) begin :b
... // error -- using "i" as loop index for two nested generate loops
end
end
endmodule
------
module mod_b;
genvar i;
reg a;
for (i=1; i<5; i=i+1) begin : a
... // error -- "a" conflicts with name of reg "a"
end
endmodule
-----
module mod_c;
genvar i;
for (i=1; i<5; i=i+1) begin : a
...
end
for (i=10; i<15; i=i+1) begin : a
... // error -- "a" conflicts with name of previous
... // loop even though indices are unique
end
endmodule
例 2 利用循环generate块连续赋值的参数化格雷码转二进制码模块:
例 3-在generate循环外声明二维net的纹波加法器:
例 4-在generate循环内进行net声明的波纹加法器:
module addergen1 (co, sum, a, b, ci);
parameter SIZE = 4;
output [SIZE-1:0] sum;
output co;
input [SIZE-1:0] a, b;
input ci;
wire [SIZE :0] c;
genvar i;
assign c[0] = ci;
// Hierarchical gate instance names are:
// xor gates: bit[0].g1 bit[1].g1 bit[2].g1 bit[3].g1
// bit[0].g2 bit[1].g2 bit[2].g2 bit[3].g2
// and gates: bit[0].g3 bit[1].g3 bit[2].g3 bit[3].g3
// bit[0].g4 bit[1].g4 bit[2].g4 bit[3].g4
// or gates: bit[0].g5 bit[1].g5 bit[2].g5 bit[3].g5
// Gate instances are connected with nets named:
// bit[0].t1 bit[1].t1 bit[2].t1 bit[3].t1
// bit[0].t2 bit[1].t2 bit[2].t2 bit[3].t2
// bit[0].t3 bit[1].t3 bit[2].t3 bit[3].t3
for (i=0; i<SIZE; i=i+1) begin :bit
wire t1, t2, t3;
xor g1 ( t1, a[i], b[i]);
xor g2 ( sum[i], t1, c[i]);
and g3 ( t2, a[i], b[i]);
and g4 ( t3, t1, c[i]);
or g5 ( c[i+1], t2, t3);
end
assign co = c[SIZE];
endmodule
例 5-多级generate循环:
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!