在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_1 2 3 module buffer_1( 4 input wire in, 5 output wire out 6 ); 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 generate 11 for(i=0; i<8; i=i+1) begin:BLOCK1 12 buffer_1 buffer_1_1(.in(din[i]), .out(dout[i])); 13 end 14 endgenerate 15 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 stimulate 15 initial begin 16 din = 8‘d7; 17 #10; din = 8‘d6; 18 #10; din = 8‘d4; 19 #10; din = 8‘d7; 20 #10; $finish(); 21 end 22 23 endmodule
汤晓东
2014-06-13 晚 于苏州
Verilog中generate语句的用法
时间: 2024-10-27 17:02:07