verilog生成语句可以动态地生成verilog代码。这一声明语句方便了参数化模块的生成。
生成语句能够控制变量的声明,任务或函数的调用,还能对实例引用进行全面的控制。
编写生成块语句代码时必须在模块中说明生成的实例范围,关键字generate - endgenerate
用来指定范围。生成语句生成的实例具有唯一的标识名,因此可以用层次命名规则引用。
此外,究竟是使用按照次序或者参数名赋值的参数重新定义,还是使用defparam
声明的参数重新定义,都可以在生成范围中定义。注意:生成范围中定
义的defparam语句所能够重新定义的参数必须是在同一个生成范围内,
或者是在生成范围的层次化实例中。
任务或函数的声明也允许出现在生成范围之中,但是不能出现在循环
生成当中。生成任务和函数同样具有唯一的标识符名称,可以被
层次引用。
不允许出现在生成范围之中的模块项声明包括:
参数、局部参数;输入、输出和输入/输出声明;指定块
生成模块实例的连接方法与常规模块实例相同。
在verilog中有三种创建生成语句的方法:
循环生成;条件生成;case生成。
循环生成语句允许使用者对下面的模块或模块项进行多次实例引用:
变量声明;
模块;
用户定义原语、门级原语;
连续赋值语句;
initial和always块;
针对这5种可使用循环生成语句的情况要分别实验。
module bitwise_sor(out,i0,i1);
parameter N=32;
output [N-1:0] out;
input [N-1:0],i0,i1;
//声明一个临时循环变量 当然,如果不需要这个临时变量也可以不声明。
//该变量只用于生成块的循环计算
//verilog仿真时该变量在设计中并不存在
genvar j;
//用一个单循环生成按位异或的xor门
generate
for(j=0;j
begin:xor_loop //块命名为xor_loop
xor xorgate(out[j],i0[j],i1[j]);
end //在生成块内部结束循环
endgenerate //结束生成块
//用always块来替代生成异或门
reg [N-1:0] out;
generate
for(j=0;j
begin
always @(i0[j] or i1[j]) //循环生成语句中使用always
out[j] = i0[j] ^ i1[j];
end
endgenerate
循环生成语句可以嵌套使用。xor_loop是赋予循环生成语句的名字,目的在于通过它
对循环生成语句之中的变量进行层次化引用。因此,循环生成语句中各个异或门的
相对层次名为xor_loop[0].xorgate,xor_loop[1].xorgate....
生成范围内可以声明下列数据类型:
1)net,reg
2)integer,real,time(时间型),realtime(实数时间类型)
时间类型用于仿真,时间变量通过使用关键字time来声明,其宽度与具体实现无关,最小为64位,通过调用系统函灵敏$time可以取得当前仿真时间
real说明的变量的缺省值为0,不允许对real声明值域,位界限或字节界限,当前x或z
赋予real类型寄存器时,这些值作为0处理。realtime与real类型完全相同。
3)event(事件)