EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——generate之战
H! b/ E. x# h6 \- y
4 C q+ E3 Z7 |, o/ |4 f1 k2 Rgenerate的主要功能就是对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 其中 generatefor(i=0; i<4; i=i+1) begin: gfor_block assigntemp = indata[2*i+1:2*i]; end endgenerate 等同于以下四句话: assigntemp[0] = indata[1:0]; assigntemp[1] = indata[3:2]; assigntemp[2] = indata[5:4]; assigntemp[3] = indata[7:6];
8 D+ E2 s! T$ B/ I9 d8 N9 b+ D 例2:利用generate_for来复制always 其中 generatefor(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];
0 T& l @% l/ ]8 J
N# S \7 g0 k2 _& Q1 j/ o
; S3 {) v9 `! l4 v. D! L2 E
8 b/ v4 L2 @- R, Z6 Q3 e2 r
- t# f8 @0 d4 [: D! X 例3:利用多个generate_for来实现复制模块 1 g& k" ]/ U1 J- h. _( n9 D
其中 generatefor(i=0; i<4; i=i+1) begin: gfor_block_a for(j=0;j<2; j=j+1) begin: gfor_block_b assigntemp[j] = indata[2*i+j]; end end endgenerate 6 p1 f' x( M. H# a& ^
) g: ]( N. ^, L% S9 y等同于以下八句话: assigntemp[0] [0]= indata[0]; assign temp[0] [1]=indata[1]; assigntemp[1] [0]= indata[2]; assigntemp[1] [0] = indata[3]; assigntemp[2] [0] = indata[4]; assigntemp[2] [1] = indata[5]; assigntemp[3] [0] = indata[6]; assign temp[3] [1]= indata[7];
+ f$ L! a$ \* ?. J: t* {+ d- e2. generate_if generate_for是用于复制模块,而generate_if则是根据模块的参数(必须是常量)作为条件判断,来生产满足条件的电路。 例子如下: 上述代码生产的RTL电路图如下:
. u$ c7 P U! Q: N1 p 当把WIDE改成等于12的时候,代码如下: 当把WIDE改成等于12的时候,RTL电路图如下:
, _1 O8 V/ H; U7 x6 b: u, W+ |; p) \4 W1 r9 I; }" k& ]
( z2 E0 @0 P$ j' }4 M
3. generate_case generate_case其实跟generate_if一样的,都是根据模块的参数(必须是常量)作为条件判断,来生产满足条件的电路,不同的地方仅仅是改成使用case 的语法而已。 例子如下: 其中RTL图如下: " @7 I( D: d! b! {" J6 }
当把WIDE改成等于1的时候: WIDE等于1的时候,RTL图如下:
* D: v x! F) r+ ]8 e3 g2 ] |