首页 > 代码库 > Verilog中generate语句的用法

Verilog中generate语句的用法

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

  • 首先设计一个1bit位宽的buffer_1,这里有几点需要注意的是:
  • module头的申明,这里采用了verilog-2005的风格,目前来讲的稍微新一点的仿真/综合工具都是支持的;
  • 这种风格相比较verilog-1995/2002等,要简洁明了,便于代码的阅读和维护;
1 //1bit width buffer_12 3 module buffer_1(4     input    wire    in,5     output   wire    out6 );7     assign out = ~in;8 9 endmodule
  • 在buffer_8中例化buffer_1 8次,这里有几点需要注意:
  • 循环变量i必须是genvar类型的,不可以是reg型,integer型;
  • for循环之后的的begin最好加上一个标号(BLOCK1);
 1 //8bit width buffer 2  3 module buffer_8( 4     input    wire[7:0] din, 5     output   wire[7:0] dout 6 ); 7      8     // Generate block 9     genvar i;10     generate11         for(i=0; i<8; i=i+1) begin:BLOCK112             buffer_1 buffer_1_1(.in(din[i]), .out(dout[i]));13         end14     endgenerate15 16 endmodule
  • 这里给出了一个简单的顶层
 1 //testbench 2 module buffer_8_tb; 4      // reg & wire define area 5      reg [7:0] din; 6      wire[7:0] dout; 7  8      // Instance the DUT 9       buffer_8 buffer_8_1(10          .din  (din    ),11          .dout (dout   )12       );13       14       // Generate the stimulate15       initial begin16                din = 8d7;17           #10; din = 8d6;18           #10; din = 8d4;19           #10; din = 8d7;20           #10; $finish();21        end22 23 endmodule

 

汤晓东

2014-06-13 晚 于苏州