热度 23
2012-5-3 16:10
11350 次阅读|
1 个评论
Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,tash,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语句进行循环。 实例1.generate-for循环:例化8-bit加法器 generate genvar i; for (i=0; i=7; i=i+1) begin : for_name adder add (a , b , ci , sum_for , c0_or ); end endgenerate for循环以begin开始,end结束,begin后边必须有一个唯一的标识符。 在for循环里使用always语句: generate genvar i; //ant0 for (i = 0; i 11; i = i + 1) begin : carrier_iq_data_gen always @ (ul_a0_i_vld or ul_a0_q_vld) begin ul_a0_iq = ul_a0_i_vld ; ul_a0_iq = ul_a0_q_vld ; end endgenerate 实例2.generate-if-else例化不同的实例:基于数据宽度,例化乘法器 generate if (IF_WIDTH 10) begin : if_name multiplier_imp1 # (IF_WIDTH) u1 (a, b, sum_if); end else begin : else_name multiplier_imp2 # (IF_WIDTH) u2 (a, b, sum_if); end endgenerate 实例3.generate-case例化不同的实例:基于数据宽度,例化加法器 generate case (WIDTH) 1: begin : case1_name adder #(WIDTH*8) x1 (a, b, ci, sum_case, c0_case); end 2: begin : case2_name adder #(WIDTH*4) x2 (a, b, ci, sum_case, c0_case); end default: begin : d_case_name adder x3 (a, b, ci, sum_case, c0_case); end endcase endgenerate