86,Verilog-2005标准篇:循环(loop generate)结构体用法介绍

循环结构体允许使用类似for循环语句的语法来多次例化generate块。在循环方案中使用循环索引变量之前,应在genvar声明中定义该变量。

genvar在elaboration阶段作为整数使用,以评估生成循环的次数并创建generate块实例,但genvar在仿真或代码运行时并不存在。除了在循环方案中,genvar不得在其他地方使用。循环方案中的初始化赋值和迭代赋值都应赋值给同一个genvar。

在循环构造的generate块中,有一个隐式的 localparam 声明。这是一个整数参数,它的名称和类型与循环索引变量相同,在生成块的每个实例中,它的值都是索引变量在实例生成时的值。该参数可在generate块中任何地方使用,与integer类型值的普通参数一样。它可以用层级名称引用。

由于这个隐式 localparamgenvar 具有相同的名称,因此在循环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吧!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值