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 = 8d7;
           #10; din = 8d6;
           #10; din = 8d4;
           #10; din = 8d7;
           #10; $finish();
        end
 
 endmodule

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

genvar 循环变量名;

generate

    // generate循环语句

    // generate 条件语句

    // generate 分支语句

    // 嵌套的generate语句

endgenerate
经验分享 程序员 微信小程序 职场和发展