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