凿子,生成块和大 Intermediate/Output 文件

Chisel, Generate Blocks and Large Intermediate/Output Files

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)
    }
  }

我正在为 rowscols >= 256 的值编译此代码。所以这个矩阵的大小变得非常大。

如果我将其编写为 Verilog 模块,我会使用 generate 块。但是,在 Chisel 中,由于我使用的是 Scala 循环,所以整个 lattice/matrix 在 FIRRTL/Verilog 输出中展开。通常使用 512x512 格子的所有 _T* 线生成 >100k 行。这会在 Chisel 编译中导致一大堆 JVM 内存不足错误,并使输出文件的 VCS 模拟(只是解析文件需要永远)非常 慢。

有什么办法解决这个问题吗?也许让 Chisel 生成 Verilog generate 块?

Chisel 和 FIRRTL 都不支持压缩它。这样的功能可能会非常有用,但我们没有计划或时间表。如果您发现节省的编译时间值得,您始终可以使用黑盒并自己编写 Verilog 来完成。