在设计中,很多情况下我们需要编写很多结构相同但参数不同的赋值语句或逻辑语句块,当参数量很大的情况下,原始的列举就会变得很笨拙甚至是不可行的。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