答案 0 :(得分:0)
生成块不能像always或initial块一样执行,它在精化阶段进行评估。 Generate通常用于实例化相同模块或逻辑的多个实例,例如:
module and_mod (input bit a, input bit b, output out);
assign out = a & b;
endmodule
module test #(
parameter NUM_INSTANCES = 3
) (
input bit [NUM_INSTANCES - 1 : 0] a,
input bit [NUM_INSTANCES - 1 : 0] b,
output bit [NUM_INSTANCES - 1 : 0] a_and_b,
output bit [NUM_INSTANCES - 1 : 0] a_or_b,
output bit [NUM_INSTANCES - 1 : 0] a_xor_b
);
genvar i;
generate
for( i = 0; i < NUM_INSTANCES; i++ )
begin
//module instance
and_mod and_inst (.a(a[i]),.b(b[i]), .out(a_and_b[i]));
//contionous assignement
assign a_xor_b[i] = a[i] ^ b[i];
//always block
always @(*)
begin
a_or_b[i] = a[i] | b[i];
end
end
endgenerate
endmodule
此生成块将评估生成块内的NUM_INSTANCES个代码副本。如您所见,您可以在生成块内部进行模块实例化,赋值,始终/初始块。请注意,and_mod只有1位宽的端口,因此我们需要3个实例来计算和3位寄存器,但是由于生成块,您不必在代码中编写3个实例。
生成块内部代码的执行取决于代码本身,分配将同时执行,内部代码块内的代码将按顺序执行,与不生成块相同。
您可以对其进行测试here。
答案 1 :(得分:0)
生成块不是用于执行。只是如果你想在一个模块中有多个重复的块,那么你可以使用generate block。
生成构造用于有条件地或多次将生成块实例化为模型。
生成块是一个或多个模块项的集合。生成块可能不包含端口声明,指定块或specparam声明。在generate块中声明的参数应被视为localparams。生成块中允许包括其他生成构造的所有其他模块项。
生成构造提供参数值影响设计结构的能力。它们还允许更简洁地描述具有重复结构的模块,并且它们使递归模块实例化成为可能。
在详细设计过程中评估生成方案。他们 不要在模拟时执行。它们在详细评估时进行评估 时间,结果在模拟开始前确定。
有关详细信息,请参阅SV1800-2012 LRM中的主题27。