【问题标题】:For loop is not unrolling in chiselFor循环没有在凿子中展开
【发布时间】:2014-09-30 04:28:36
【问题描述】:

我试图了解我们如何从 chisel 中的“for”循环中生成 verilog 代码。 通常,verilog 代码用于展开主体的次数与循环进度一样多,但在 chisel 中它只展开一次。

val io = new Bundle {

    val a = UInt(INPUT, 2)

    val output = UInt(OUTPUT, 2)
  }

    io.output := UInt(0)

    for(j <- 0 to 4){

      io.output := io.a
    }

上述程序对应的verilog代码为:

module LutSimpleALU(

    input [1:0] io_a,
    output[1:0] io_output
);

   assign io_output = io_a;

endmodule

如果有人能说出 for 循环是如何工作的,那将非常有帮助。

【问题讨论】:

  • 在for块中,没有使用循环计数器变量“j”,所以for循环只是重复执行“io.output := io_a”。结果,verilog 提取了 for block 的第一次执行,即“io.output := io_a”。
  • 这意味着我必须始终使用“j”才能使循环工作?
  • 您一次又一次地执行相同的代码“io.output := io.a”。 Verilog 认为重复执行是没有意义的,执行一次就足够了。我不知道在从不使用循环计数器的 for 块的每次执行中执行不同的方式。
  • 你能分享一个循环展开的小例子吗?
  • 部分代码“for(j

标签: hardware chisel


【解决方案1】:

你的 for 循环在每次迭代中都做同样的事情。您没有在任何地方使用“j”迭代器变量,所以这就是它的扩展:

io.output := io.a
io.output := io.a
io.output := io.a 
io.output := io.a 

这里的语义是最后一个写入者获胜,因此“io.output = io.a”的最后一条语句将是最终值。实际上,前面的三个语句没有任何意义,因此将从图中删除它们。

【讨论】:

  • 感谢您的回复。我得到了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多