北魏传奇电视剧第一部:Verilog中generate用法

来源:百度文库 编辑:中财网 时间:2024/04/29 21:57:40

Verilog中generate用法

默认分类 2009-03-14 20:41:33 阅读303 评论1 字号:大中

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,continous assignment,initial和always。在generate语句中可以引入if-else和case语

Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,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      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

from: http://hi.baidu.com/lavien520/blog/item/20257383ba7e8727c75cc372.html