generate的主要功能就是对module,net,reg,parameter,assign,always,task,function进行复制,在这里,我们这主要是介绍generate和for的搭配使用。

1. generate_for

使用generate_for的时候,必须要注意以下几点要求:

l 必须使用genvar申明一个正整数变量,用作for的判断变量;

l for里面的内嵌语句,必须写在begin_end里面;

l begin_end需要一个名字。

例1:利用generate_for来复制assign

forum.jpg

1-11

其中

generate for(i=0; i<4; i=i+1)

begin : gfor_block

assign temp = indata[2*i+1:2*i];

end

endgenerate

等同于以下四句话:

assign temp[0] = indata[1:0];

assign temp[1] = indata[3:2];

assign temp[2] = indata[5:4];

assign temp[3] = indata[7:6];

例2:利用generate_for来复制always

forum.jpg

4841

其中

generate for(i=0; i<4; i=i+1)

begin : gfor_block

always @ (*)

temp = indata[2*i+1:2*i];

end

endgenerate

等同于以下八句话:

always @ (*)

temp[0] = indata[1:0];

always @ (*)

temp[1] = indata[3:2];

always @ (*)

temp[2] = indata[5:4];

always @ (*)

temp[3] = indata[7:6];

例3:利用多个generate_for来实现复制模块

其中

generate for(i=0; i<4; i=i+1)

begin : gfor_block_a

for(j=0; j<2; j=j+1)

begin : gfor_block_b

assign temp[j] = indata[2*i+j];

end

end

endgenerate


等同于以下八句话:

assign temp[0] [0]= indata[0];

assign temp[0] [1]= indata[1];

assign temp[1] [0]= indata[2];

assign temp[1] [0] = indata[3];

assign temp[2] [0] = indata[4];

assign temp[2] [1] = indata[5];

assign temp[3] [0] = indata[6];

assign temp[3] [1] = indata[7];


2. generate_if

generate_for是用于复制模块,而generate_if则是根据模块的参数(必须是常量)作为条件判断,来生产满足条件的电路。

3. generate_case

generate_case其实跟generate_if一样的,都是根据模块的参数(必须是常量)作为条件判断,来生产满足条件的电路,不同的地方仅仅是改成使用case 的语法而已。