verilog - 在verilog中使用for循环生成

标签 verilog

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

同时使用生成和 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

我认为这两个片段基本上会产生相同的结果,即 temp[0] 到 temp[10] 等于值 0。在这种情况下使用生成语句我们看到的差异/优点是什么?

最佳答案

一般来说,generate for 循环和常规 for 循环之间的主要区别在于,generate for 循环为每次迭代生成一个实例。这意味着在您的示例中将有 3 个 Always block (而不是常规循环情况下的 1 个 block )。

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

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 实例的工作。

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

关于verilog - 在verilog中使用for循环生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924485/

相关文章:

Verilog 运行时错误和 ModelSim

c - verilog 中的 ascii-hex 转换

vim - Verilog代码颜色丢失

constants - 如何在verilog中使用const

Verilog HDL循环语句错误: loop with non-constant loop condition must terminate

verilog - 如何在 Verilog 中对数字进行符号扩展

Verilog 中的断言语句

verilog - 为什么在此 Verilog HDL 代码中使用两个触发器而不是一个?

properties - 我可以在一个循环中生成多个 SystemVerilog 属性吗?

verilog - 在 Verilog 程序中使用连续赋值?