您的位置:首页 > 其它

Verilog中generate用法

2014-08-19 16:26 204 查看
原文地址:Verilog中generate用法作者:zeuxverilog2001中有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<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: