2016-10-12 28 views
0
  1. 何时在Verilog模块中执行“GENERATE BLOCK”?
  2. 生成块内的代码是否会按顺序执行?
+0

请显示与该问题相关的一些代码,因为这样会更容易给出一个好的答案。 –

+0

@MortenZilmer我一直在阅读关于IEEE-Verilog pdf中的'Generate'。它表示'生成块在制定时执行,而不是在模拟时执行'。这种说法是什么意思? –

+0

详细阐述是指将所有模块组合成可以在之后进行仿真的一致设计,并且例如根据模块在使用位置的配置,为模块中的参数分配特定值。 –

回答

0

生成块不能像总是或初始块一样执行,它在精化阶段进行评估。产生是常用的实例相同模块或逻辑,多个实例,例如:

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

+0

感谢您的回答。 –

0

生成块不用于执行。只是,如果你想在模块中有多个重复块,那么你可以使用生成块。

生成结构用于有条件或多个实例化生成块到模型中。

生成块是一个或多个模块项目的集合。生成块可能不包含端口声明,指定块或specparam声明。在生成块中声明的参数应视为localparams。所有其他模块项目,包括其他生成结构,都可以在生成块中使用。

生成结构提供参数值影响设计结构的能力。它们还允许将具有重复结构的模块更简洁地描述,并使递归模块实例化成为可能。

生成方案在设计过程中进行评估。他们 不会在模拟时间执行。他们在详述 时间被评估,并且结果在模拟开始之前被确定。

有关更多详细信息,请参阅SV1800-2012 LRM中的主题27。

+0

感谢您的回答 –