【问题标题】:Using a generate with for loop in verilog在verilog中使用带有for循环的生成
【发布时间】:2014-09-19 00:22:09
【问题描述】:

我试图理解为什么我们在 verilog 中使用 generate 和 for 循环。

同时使用 generate 和 for 循环:

reg [3:0] temp;
genvar i;
generate
for (i = 0; i < 3 ; i = i + 1) begin: 
    always @(posedge sysclk) begin
        temp[i] <= 1'b0;
    end
end
endgenerate

仅使用 for 循环:

reg [3:0] temp;
genvar i;
always @(posedge sysclk) begin
  for (i = 0; i < 3 ; i = i + 1) begin: 
    temp[i] <= 1'b0;
    end
end

我正在考虑两个 sn-ps 基本上会产生相同的结果,即 temp[0] 到 temp[10] 等于值 0。在这种情况下,我们使用 generate 语句看到的区别/优势是什么?

【问题讨论】:

  • 你试过编译这些sn-ps吗?第二个应该是语法错误。只有当 for 循环在 generate 中时,您才能将 always 放在 for 循环中!
  • @user1995025, i 需要是genvar
  • @Ari:感谢您为我解惑。我现在了解生成的要求。
  • @Greg:我确实在第一个 sn-p 中将 i 声明为 genvar。
  • @user1995025 它是第二个 sn-p 中的 integer 并且需要是 genvar 才能合法

标签: verilog


【解决方案1】:

一般来说,generate for 循环和常规 for 循环的主要区别在于 generate for 循环是为每次迭代生成一个实例。这意味着在 您的 示例中将始终存在 3 个块(与常规循环情况下的 1 个块相反)。

需要生成的代码的一个很好的例子是:

module A();
..
endmodule;

module B();
parameter NUM_OF_A_MODULES = 2; // should be overriden from higher hierarchy
genvar i;
for (i=0 i<NUM_OF_A_MODULES; i=i+1) {
  A A_inst();
}
endmodule;

在此示例中,常规 for 无法完成创建 NUM_OF_A_MODULES 个实例的工作。

您的示例中,您可以通过两种方式获得所需的结果。 (只要你修复了一些小错误:))

【讨论】:

    【解决方案2】:

    在没有generate 的示例中,i 应该是genvar 而不是integer。否则,两者都有效,具体取决于您的工具集支持的 IEEE Std 1364 版本。在 IEEE Std 1364-2001 中添加了 generate 构造,其中明确需要 generate/endgenerate 关键字。在 IEEE Std 1364-2005 中,它变成了可选的,唯一的要求是如果使用 generate,它必须有一个匹配的 endgenerate

    当使用 IEEE Std 1364-2005 或 SystemVerilog (IEEE Std 1800) 时,隐式声明与显式声明的编码风格偏好有关。显式确实具有向后可比性的优势。


    Generate 块在通过参数更改 then 模块的物理结构时很有用。例如选择 negedge 或 posedge 时钟并且只启用一个:

    if ( param_use_pos == 1) begin : use_pos
      always @(posedge sysclk) begin
        ...
      end
    end
    else begin : use_neg
      always @(negedge sysclk) begin
         ...
      end
    end
    

    如果您不更改物理结构,通常最好在 always 块中使用 for 循环和 if-else 语句。两种方法可以合成相同的,但是在运行 RTL 仿真时,非生成块方法通常会更快地仿真。这是因为模拟器通常可以比 N 个 1 位操作更快地处理单个 N 位操作。再次合成也是一样的结果

    // faster :: 1 always block, simulator can optimize the for loop
    always @(posedge sysclk) begin 
      for (i = 0; i < 3 ; i = i + 1) begin
        temp[i] <= 1'b0;
      end
    end
    
    // slower :: creates 4 always blocks, harder for the simulator to optimize
    genvar i;
    generate // optional if > *-2001
    for (i = 0; i < 3 ; i = i + 1) begin 
        always @(posedge sysclk) begin
            temp[i] <= 1'b0;
        end
    end
    endgenerate // match generate 
    

    【讨论】:

    • 我认为一个示例展示了如何使用 generate 来创建参数化数量的实例化,其中 for 循环可以迭代固定硬件,两者之间的差异可能会更加清晰。跨度>
    【解决方案3】:

    generate for 循环允许您访问(使用分层名称)生成的实例的内部信号。常规的 for 循环不允许您这样做。

    否则,原则上,循环展开会发生在两者上(至少对于可合成的构造)。

    因此,对于测试平台,使用常规的for 循环可能更典型,但对于设计模块,使用generate for 循环可能更典型。

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多