freeren_liming的个人空间 https://blog.eetop.cn/527831 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Verilog-2001中generate的使用

已有 23922 次阅读| 2013-11-3 14:31 |个人分类:IC design

长时间使用verilog-95, 本人又比较懒,后来改用Verilog 2001后。突然有一天在验证时遇到了generate这个东西,而且是RTL中使用的。当时可能是有些奇怪,虽然凭多年工作经验可大致猜到那段code的功能,但是究竟该如何使用generate语句,却并不清楚,所以回来后就百度了一下,查了一些文章,这里与大家分享一下。

原文:http://bbs.ednchina.com/BLOG_ARTICLE_3003610.HTM。本文在此基础上,做了部分排版。

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语句进行循环。(即:generate可以配合控制语句中的if,for,case使用),在此要说明一下generate块是可以综合的:

用法:

1. generate语法有generate for, genreate if和generate case三种

2. generate for语句必须有genvar关键字定义for的变量

3. for 的内容必须加begin和end

4. 必须给for语段起个名字

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

 

实例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[i], 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[i];               

                  ul_a0_iq[i * 2 + 1] = ul_a0_q_vld[i];                

           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

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

 


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 1

    好友
  • 0

    获赞
  • 2

    评论
  • 1788

    访问数

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-5 13:27 , Processed in 0.014920 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部