Verilog中generate语法和作用

Verilog中generate语句的用法
在Verilog-2001中新增了语句generate,通过generate循环,可以产生一个对象(比如一个元件或者是一个模块)的多次例化,为可变尺度的设计提供了方便,generate语句一般在循环和条件语句中使用,为此,Verilog-2001增加了四个关键字generate,endgenerate, genvar, localparam,genvar是一个新增的数据类型,用在generate的循环中的标尺变量必须定义为gnevar类型;

下面举例说明generate的用法:

首先设计一个1bit位宽的buffer_1:

//1bit width buffer_1
 
 module buffer_1(
     input    wire    in,
     output   wire    out
 );
     assign out = ~in;
 
 endmodule

在buffer_8中例化buffer_1 8次,这里有几点需要注意:

循环变量i必须是genvar类型的,不可以是reg型,integer型;
for循环之后的的begin最好加上一个标号(BLOCK1);

//8bit width buffer
  
  module buffer_8(
      input    wire[7:0] din,
      output   wire[7:0] dout
  );
      
      // Generate block
      genvar i;
     generate
         for(i=0; i<8; i=i+1) begin:BLOCK1
             buffer_1 buffer_1_1(.in(din[i]), .out(dout[i]));
        end
     endgenerate
 
 endmodule

这里给出了一个简单的顶层:

 //testbench
  module buffer_8_tb;
       // reg & wire define area
       reg [7:0] din;
       wire[7:0] dout;
  
       // Instance the DUT
        buffer_8 buffer_8_1(
          .din  (din    ),
          .dout (dout   )
       );
       
       // Generate the stimulate
       initial begin
                din = 8'd7;
           #10; din = 8'd6;
           #10; din = 8'd4;
           #10; din = 8'd7;
           #10; $finish();
        end
 
 endmodule

generate语法
定义genvar,作为generate种的循环变量。
generate语句中定义的for语句,必须要有begin,为后续增加标签做准备。
begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。
可以使用在generate语句中的类型主要有
ü module(模块)
ü UDP(用户自定义原语)
ü 门级原语
ü 连续赋值语句
ü initial或always语句
基本结构如下:

genvar 循环变量名;

generate

    // generate循环语句

    // generate 条件语句

    // generate 分支语句

    // 嵌套的generate语句

endgenerate
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值