Verilog中generate用法

来源:互联网 发布:防蹭网软件 编辑:程序博客网 时间:2024/05/18 10:52
原文地址:Verilog中generate用法作者:zeux

verilog2001中有generate这个语法,近日有用到,简单归纳如下:

语法:

1。genvar后面的for,变量必须是genvar变量;generate+if,不如`ifdef `else`endif;

2。for里必须有begin,哪怕只有一句;

3。begin必须有名称,原因见4;

4。这里例化的模块名称是inst[j].unit;

5。generate语句可以看作是标准化为块的综合指令。

应用实例:

generate可以用for,case,if。其中,generate实例化多个器件很简洁。

案例

generate

genvar j ;

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

   begin : inst

     dff #(PARAMETER) unit(

                                        .clk(clk),

                                        .ena(ena),

                                       .in(in),

                                        .out(out)

                                        ) ;

end

 

 

generate还可以进行多个assign赋值!

案例

module anytest_v(
    input clk,
    input[7:0] datain,
    output[7:0] dataout,
    output finish
    );

wire[7:0] mem[31:0];
wire[32*8-1:0] xxx;
//reg[7:0] i;
generate
      genvar i;
      for(i=0;i<=31;i=i+1)
      begin :wiertech
            assign mem[i]= 8'b0;
      end
endgenerate
endmodule

 

 

10 module memory_to_vector (

11   input [VECTORSIZE-1: 0]mem [ARRAYSIZE-1: 0],

12   output[ARRAYSIZE*VECTORSIZE-1: 0] vec

13 );

14

15 parameter VECTORSIZE = 4;

16 parameter ARRAYSIZE = 3;

17

18 genvar i,j;

19 generate

20   for(i = 0; i< ARRAYSIZE-1; i = i + 1) begin : array

21    for(j = 0; j < VECTORSIZE-1; j = j + 1) begin :vector

22      assign vec[i * VECTORSIZE + j] = mem[i][j];

23    end

24   end

25 endgenerate

26

27 endmodule

Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continousassignment,initial和always。在generate语句中可以引入if-else和case语

Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continousassignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。
     
     为此,Verilog-2001还增加了以下关键字:generate,endgenerate,genvar,localparam。genvar为新增数据类型,存储正的integer。在generate语句中使用的index必须定义成genvar类型。localparam与parameter有些类似,不过其不能通过redefinition改变值。除了可以在generate语句中使用if-else,case外,还能使用for语句进行循环。
     
     下面是一个使用generate的例子,根据a_width和b_width的不同,实例化不同的multiplier。
     
     module multiplier (a, b, product);
     parameter a_width = 8, b_width = 8;
     localparam product_width = a_width+b_width;
     input [a_width-1:0] a;
     input [b_width-1:0] b;
     output[product_width-1:0]product;
     generate
     if((a_width < 8) || (b_width <8))
     CLA_multiplier #(a_width, b_width)
     u1 (a, b, product);
     else
     WALLACE_multiplier #(a_width, b_width)
     u1 (a, b, product);
     endgenerate
     endmodule
     在下面的例子中,在generate语句中使用了for语句。
     
     module Nbit_adder (co, sum, a, b, ci);
     parameter SIZE = 4;
     output [SIZE-1:0] sum;
     output co;
     input [SIZE-1:0] a, b;
     input ci;
     wire [SIZE:0] c;
     genvar i;
     assign c[0] = ci;
     assign co = c[SIZE];
     generate
     for(i=0; i<SIZE; i="i"+1)
     begin:addbit
     wire n1,n2,n3; //internal nets
     xor g1 ( n1, a[i], b[i]);
     xor g2 (sum[i],n1, c[i]);
     and g3 ( n2, a[i], b[i]);
     and g4 ( n3, n1, c[i]);
     or g5 (c[i+1],n2, n3);
     end
     endgenerate
     endmodule
     generate执行过程中,每一个generated net在每次循环中有唯一的名字,比如n1在4次循环中会产生如下名字:
     
     addbit[0].n1
     addbit[1].n1
     addbit[2].n1
     addbit[3].n1
     这也是为什么在begin-end块语句需要名字的一个原因。同样,实例化的module,gate等在每次循环中也有不同的名字。
     
     addbit[0].g1
     addbit[1].g1
     addbit[2].g1
     addbit[3].g1

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上班迟到1个小时怎么办 想家想的都哭怎么办 想学手艺被骗学费怎么办 小腿肚后面筋和肌肉压痛怎么办 尿道囗和屁股眼中间长疮怎么办? 2个多月的宝宝蛋蛋上有个包怎么办 幼儿园睡觉自己摸下身玩怎么办 猫猫打喷嚏有透明液体怎么办 夏季穿运动鞋出了脚气怎么办 脚底长了刺瘊子怎么办 凉鞋前面踢破了怎么办 尖头鞋前面折了怎么办 月子里宝宝蛋蛋破皮怎么办 军人在训练时想上侧所怎么办 被白蚂蚁咬了怎么办 被蚂蚁咬了起包怎么办 脚踢了石头肿了怎么办 脚大拇指踢肿了怎么办 被骨头咯到了疼怎么办 被开水烫着了疼怎么办 鞋子上踩了口香糖怎么办 鞋底踩到口香糖干了怎么办 鞋子不小心踩到口香糖怎么办 站久了膝盖痛怎么办 站久了脚底板痛怎么办 蛇疮好了以后痛怎么办 站久了脚趾痛怎么办 心脏被踢了一脚怎么办 从马背上摔下来怎么办 小孩蛋蛋碰撞后有积液怎么办 小孩蛋蛋大小不一样有积液怎么办 对派出所的笔录不服怎么办 蛋蛋让尿淹了发红有小红瘩达怎么办 手被皮筋弹肿了怎么办 手被皮筋勒肿了怎么办 皮筋把手挤肿了怎么办 猫被皮筋绑久肿了怎么办 抗链0高关节疼怎么办 近视800度老了怎么办 军检体重不达标怎么办 到交房租没有钱怎么办