【发布时间】:2018-03-26 09:09:24
【问题描述】:
Chisel 中是否有一个构造来生成 Verilog generate 块,而不是将 Scala for 循环展开为 非常 大(>100k 行)输出 Verilog 和 FIRRTL 文件。
例如,我有以下代码,它构造了MatrixElement 模块的二维点阵并连接它们的输入和输出。
private val mat_elems = Seq.tabulate(rows, cols) { (i, j) => {
Module(new MatrixElement(n=i, m=j))
}}
for (i <- 0 until rows; j <- 0 until cols) {
// Wavefront propagation
if (i == 0 && j != 0) {
// First row
mat_elems(i)(j).io.in <> (false.B, false.B, mat_elems(i)(j - 1).io.out)
} else if (i != 0 && j == 0) {
// First col
mat_elems(i)(j).io.in <> (false.B, mat_elems(i - 1)(j).io.out, false.B)
} else if (i >= 1 && j >= 1) {
// Internal matrix
mat_elems(i)(j).io.in <> (mat_elems(i - 1)(j - 1).io.out, mat_elems(i - 1)(j).io.out,
mat_elems(i)(j - 1).io.out)
}
}
我希望为 rows 和 cols >= 256 的值编译此代码。所以这个矩阵的大小变得非常大。
如果我将其编写为 Verilog 模块,我会使用 generate 块。然而,在 Chisel 中,由于我使用的是 Scala 循环,因此整个晶格/矩阵在 FIRRTL/Verilog 输出中展开。通常使用 512x512 格的所有 _T* 线产生 >100k 线。这会在 Chisel 编译中导致一大堆 JVM 内存不足错误,并使输出文件的 VCS 模拟(仅解析文件需要很长时间)非常变慢。
有没有办法解决这个问题?也许让 Chisel 生成 Verilog generate 块?
【问题讨论】:
标签: hdl chisel loop-unrolling