原创 verilog之generate的使用

2012-5-3 16:10 11372 22 23 分类: FPGA/CPLD

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[8*i+7 : 8*i], b[8*i+7 : 8*i], ci, sum_for[8*i+7 : 8*i], c0_or[i+1]);

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[i * 2]     = ul_a0_i_vld;               

                  ul_a0_iq[i * 2 + 1] = 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

 

  

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户411510 2016-1-21 11:38

来了
相关推荐阅读
用户408415 2012-04-16 10:09
【博客大赛】学习笔记——脉冲信号跨时钟域同步问题
最近一直忙于TDD LTE RRH2.6g CPRI压缩的测试,每天忙碌到很晚。我今天回想起来,竟也觉得没留下什么深刻的印象,不知道是不是没有因为记录的习惯。那么从现在开始,像HOKI学习,坚持写...
EE直播间
更多
我要评论
1
22
关闭 站长推荐上一条 /3 下一条