【问题标题】:Execution of Generate Block生成块的执行
【发布时间】:2016-10-12 07:57:29
【问题描述】:
  1. 什么时候在 Verilog 模块中执行“生成块”?
  2. Generate Block 中的代码会顺序执行吗?

【问题讨论】:

  • 请显示一些与问题相关的代码,因为这样更容易给出一个好的答案。
  • @MortenZilmer 我一直在阅读 IEEE-Verilog pdf 中的“生成”。它说“生成块是在精化时执行的,而不是在模拟时执行的”。那句话是什么意思?
  • 精化是将所有模块组合成一个一致的设计,然后可以进行模拟,例如模块中的参数根据模块所在位置的配置分配特定值用过。

标签: verilog fpga


【解决方案1】:

生成块不能像往常或初始块一样执行,它在细化阶段进行评估。 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 个实例。

generate块内代码的执行依赖于代码本身,赋值会并发执行,always块内的代码会顺序执行,和没有generate块一样。

您可以测试它here

【讨论】:

    【解决方案2】:

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

    生成构造用于有条件地或将生成块实例化到模型中。

    生成块是一个或多个模块项的集合。生成块可能不包含端口声明、指定块或规范参数声明。在生成块中声明的参数应被视为局部参数。生成块中允许所有其他模块项,包括其他生成构造。

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

    在设计的细化过程中评估生成方案。他们 不要在仿真时执行。他们在精心设计时进行评估 时间,并在模拟开始之前确定结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 2017-01-15
      • 1970-01-01
      • 2023-04-02
      • 2023-02-04
      相关资源
      最近更新 更多