执行生成阻止

时间:2016-10-12 07:57:30

标签: verilog fpga

  1. 什么时候在Verilog模块中执行“GENERATE BLOCK”?
  2. Generate Block中的代码会按顺序执行吗?

2 个答案:

答案 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。