Verilog-2001 之 generate 语句的用法
Verilog-1995 支持通过以声明实例数组的形式对 primitive 和 module 进行复制
结构建模。而在 Verilog-2001 里,新增加的 generate 语句拓展了这种用法(其思想来
源于 VHDL 语言)。除了允许复制产生 primitive 和 module 的多个实例化,同时也可以
复制产生多个 net、reg、parameter、assign、always、initial、task、function。
在 generate 中引入了一种新的变量类型:genvar,用以在 generate-for 语句中
声明一个正整数的索引变量(如果将“X”或“Z”或者“负值”赋给 genvar 变量,将会出错)。
genvar 变量可以声明在 generate 语句内,也可以声明在 generate 语句外。
generate 语句有 generate-for、genreate-if 和 generate-case 三种语句;
generate-for 语句
① generate-for 语句必须用 genvar 关键字定义 for 的索引变量;
② for 的内容必须用 begin…end 块包起来,哪怕只有一句;
③ begin…end 块必须起个名字;
例 1:一个参数化的 gray-code to binary-code 转换器;这里采用复制产生多个
assign 语句的形式来实现;
module gray2bin1 (bin, gray);
parameter SIZE = 8; // this module is parameterizable
output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
genvar i;
generate
for(i=0; i<SIZE; i=i+1)
begin: bit
assign bin[i] = ^gray[SIZE-1:i];
end
endgenerate
endmodule
等同于下面的语句:
assign bin[0] = ^gray[SIZE-1:0];
assign bin[1] = ^gray[SIZE-1:1];
assign bin[2] = ^gray[SIZE-1:2];
assign bin[3] = ^gray[SIZE-1:3];
assign bin[4] = ^gray[SIZE-1:4];
assign bin[5] = ^gray[SIZE-1:5];
assign bin[6] = ^gray[SIZE-1:6];
assign bin[7] = ^gray[SIZE-1:7];
例 2:还是例 1 的 gray-code to binary-code 转换器;不过这里采用复制产生多个
always 语句的形式来实现;
module gray2bin2 (bin, gray);
parameter SIZE = 8; // this module is parameterizable
output [SIZE-1:0] bin;