分别编译和链接模块

时间:2019-01-03 19:11:31

标签: chisel

我正在chisel3中编译一些非常大的项目,其中包含许多电线和连接。现在,顶级对象及其所有子模块都在同一个Scala包中,并且我运行sbt "runMain top.Instantiator --verilog"。但是,它在FIRRTL中崩溃的原因是:

[info] Done packaging.
[info] Running top.Instantiator --verilog --testArgs vcs
[info] [0.005] Elaborating design...
[info] [68.146] Done elaborating.
[error] (run-main-0) java.lang.NegativeArraySizeException
[error] java.lang.NegativeArraySizeException
[error]     at java.util.Arrays.copyOf(Arrays.java:3332)
[error]     at org.antlr.v4.runtime.ANTLRInputStream.load(ANTLRInputStream.java:101)
[error]     at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:64)
[error]     at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:60)
[error]     at org.antlr.v4.runtime.ANTLRInputStream.<init>(ANTLRInputStream.java:68)
[error]     at firrtl.Parser$$anonfun$1.apply(Parser.scala:35)
[error]     at firrtl.Parser$$anonfun$1.apply(Parser.scala:29)
[error]     at firrtl.Utils$.time(Utils.scala:135)
[error]     at firrtl.Parser$.parse(Parser.scala:29)
[error]     at firrtl.Driver$$anonfun$execute$1.apply(Driver.scala:171)
[error]     at firrtl.Driver$$anonfun$execute$1.apply(Driver.scala:140)
[error]     at logger.Logger$$anonfun$makeScope$1.apply(Logger.scala:129)
[error]     at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
[error]     at logger.Logger$.makeScope(Logger.scala:127)
[error]     at firrtl.Driver$.execute(Driver.scala:140)
[error]     at chisel3.Driver$.execute(Driver.scala:180)
[error]     at chisel3.Driver$.execute(Driver.scala:200)
[error]     at fringe.CommonMain$class.main(CommonMain.scala:64)
[error]     at top.Instantiator$.main(Instantiator.scala:17)
[error]     at top.Instantiator.main(Instantiator.scala)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]     at java.lang.reflect.Method.invoke(Method.java:498)
[error] Nonzero exit code: 1
[error] (Compile / runMain) Nonzero exit code: 1

我的猜测是项目中大量的电线和连接正在引起一些溢出。是否有人对这种错误有经验并提供有关如何进行调试的建议?现在,我的想法是 1)重构凿子代码,使其更易于编译 2)找出一种方法,分别为每个模块生成Verilog,然后在最后将它们链接在一起。有没有一种非递归编译的方法,因此在编译top.Instantiator时不会遇到相同的错误? 3)以某种方式将程序包/项目分开,以便sbt可以分别在每个项目上工作

谢谢

1 个答案:

答案 0 :(得分:2)

添加想法4)在凿子和firrtl之间使用protobuf序列化。

我可以看到解析器中的firrtl正在爆炸。 protobuf支持是相当新的,但是我相信它比基于antlr的解析器的内存占用要少得多。 这是一个从chisel3生成firrtl protobuf序列化的示例。

LocalLinearTrend

然后您可以使用firrtl编译器生成Verilog

import chisel3._

class XX extends Module {
  val io = IO(new Bundle {
    val i = Input(UInt(1.W))
    val o = Output(UInt(1.W))
  })

  io.o := io.i
}
object PB {
  def main(args: Array[String]): Unit = {
    val c = Driver.elaborate(() => new XX)
    Driver.dumpProto(c, None)
  }
}

或者构建自己的编译器,例如

firrtl -i XX.pb -X verilog -o XX.v

您可能需要追求其他选择,但这可能是更容易的快速解决方法。