generate语句块的讲解

在设计中,很多情况下我们需要编写很多结构相同但参数不同的赋值语句或逻辑语句块,当参数量很大的情况下,原始的列举就会变得很笨拙甚至是不可行的。C语言处理这种问题通常情况下会使用如for循环语句来完成多次的相同操作。而verilog 语言呢?同样的为我们提供了generate语句块来帮助我们完成这些过程。接下来,梦翼师兄将和大家一起开始generate语句的学习。

基本概念

generate的主要功能就是对module,net,reg,parameter,assign,always,task,function进行复制,genvar是generate语句中的一种变量类型,用以在 generate-for 语句中声明一个正整数的索引变量 (如果将“X”或“Z”或者“负值”赋给genvar 变量将会出错)。genvar 变量可以声明在 generate 语句内,也可以声明在 generate 语句外。generate 语句有 generate-for、generate-if 和 generate-case 三种语句

genrate-for

使用generate_for的时候,必须要注意以下几点要求:
a) 必须使用genvar申明一个正整数变量,用作for的判断变量;
b) for里面的内嵌语句,必须写在begin_end里面,哪怕只有一句;
c) begin_end需要一个名字。

== 例1:利用generate_for来复制assign语句==

module for_test(indata, t0, t1, t2, t3);

input [7:0] indata;            //输入8位位宽indata
output [1:0] t0, t1, t2, t3; //输出2位位宽t0,t1,t2,t3;
                             
wire [1:0] temp [3:0];        //定义位宽为2,深度为4的temp
genvar i;                                               
generate for(i=0; i<4; i=i+1 ) //generate for模块复制
    begin : gfor_block    
        assign temp[i] = indata[2*i+1:2*i];
    end                      
endgenerate                                             
assign t0 = temp[0];            //t0等于temp[0]
assign t1 = temp[1];            //t1等于temp[1]
assign t2 = temp[2];            //t2等于temp[2]
assign t3 = temp[3];            //t3等于temp[3]

endmodule

genrate-if

generate_for是用于复制模块,而generate_if则是根据模块的参数(必须是常量)作为条件判断,来产生满足条件的电路。如:

module if_test(a,  b,  c,  d);

input a, b, c;         //输入信号a,b,c
output d;               //输出信号d

localparam WIDE = 8;    //参数模块,用于选择产生的电路
generate
    if(WIDE <10)        //当WIDE小于10,d等于abc相或
        assign  d   =   a | b | c;
    else                //当WIDE大于等于10,d等于abc相与
        assign  d   =   a & b & c;
endgenerate
endmodule

generate-case

generate_case其实跟generate_if一样的,都是根据模块的参数(必须是常量)作为条件判断,来生成满足条件的电路,不同的地方仅仅是改成使用case 的语法而已。如:

module case_test(a,  b, c,  d);

input a, b, c;             //输入信号a,b,c
output d;                   //输出信号d
localparam WIDE = 12;    //参数模块,用于选择生产的电路
generate
    case(WIDE)      
    0   :                       //当WIDE等于0,d等于abc相或
            assign  d   =   a | b | c;     
    1   :                       //当WIDE等于1,d等于abc相与
			assign  d   =   a & b & c;  
    default :                   //当WIDE不等于1或0,d等于a与b或c
			assign  d   =   a & b | c;      
    endcase
endgenerate
endmodule
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值