BUAA_CO_LAB Verilog generate


今天在讨论区答疑,发现有同学问到 Verilog for 循环的问题。我只知道 for 循环能在 always 和 initial 块中使用。陈奕帅助教提到了 for 也可以在 generate 中使用,查找了相关资料进行学习。

下面是一段 Verilog 程序

module generate_for(
    input [31:0] a,
    input b,
    input c,
	 output [31:0] out
    );
	parameter d = 16;
	genvar i;
	 
	generate 
	for (i = 0; i < d && i < 32; i = i + 1) begin: gen
		assign out[i] = b;
	end
	endgenerate
	
	generate 
	for (i = d; i < 32; i = i + 1) begin: gen2
		assign out[i] = c;
	end
	endgenerate
endmodule

generate for 的主要作用是批量生成 verilog 代码块,但需要注意的是 generate for 循环中的变量除了 genvar 需要是常量。如果把 d 换成 a 就会报错。

我同时还学到了新的定义参数的方法:

module generate_for#(parameter d = 16)(
    input [31:0] a,
    input b,
    input c,
	 output [31:0] out
    );

这里定义的参数功能很强大。generate语句允许细化时间(Elaboration-time)的选取或者某些语句的重复。这些语句可以包括模块实例引用的语句、连续赋值语句、always 语句、initial 语句和门级实例引用语句等。细化时间是指仿真开始前的一个阶段,此时所有的设计模块已经被链接到一起,并完成层次的引用。这里的参数就可以作为 generate for 中的“变量”,在仿真开始前就已经确定,仿真时不会变,所以可以用于 generate 建模并生成模块。


Author: Yixiang Zhang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yixiang Zhang !
评论
  TOC