【问题标题】:Any way to work around JVM code size limits tripped by large Chisel file解决大型 Chisel 文件触发的 JVM 代码大小限制的任何方法
【发布时间】:2018-11-27 02:48:23
【问题描述】:

只是说您正在为芯片中的某些基础设施自动生成​​一些 Chisel 代码。单个文件实例化大量内存映射寄存器,然后是 IO 分配。

然后假设有一天你添加了一个额外的寄存器,JVM 就因为 JVM 中的任意 64k 方法限制大小而无法再构建它:

[error] Could not write class HasRegsModuleContents because it exceeds JVM code size limits. Method scala/Some's code too large!
[error] one error found
[error] (chipBlocks / Compile / compileIncremental) Compilation failed
[error] Total time: 41 s, completed 27/11/2018 2:32:29 AM

HasRegsModuleContents 内部是一堆寄存器的声明,然后是一个大的 regmap 语句,其中包含芯片的一堆寄存器声明。之后是模块 io 端口的分配。

这对我们来说效果很好,但现在似乎被最大化了,这很烦人。

以前有人遇到过这种情况吗?将其分解为多个寄存器块(以及更多硬件,现在在 pbus 上有多个总线接口)将是可行的,因此如果有人知道解决方法,将不胜感激。

【问题讨论】:

    标签: scala jvm chisel rocket-chip


    【解决方案1】:

    我相信同样的限制会导致火箭芯片解码表拆分为multiple classes

    不幸的是,我认为没有简单的解决方法,因为这是 JVM 本身的历史设计错误。我可以想出两种方法来解决这个问题,但我认为其中任何一种都需要一些工作:

    1. 您是否生成器将寄存器创建逻辑划分为方法

    2. 与其生成Chisel源码,不如自己编写Chisel生成必要的寄存器和相关逻辑

    #2 可能是 The Right Way™,但考虑到您当前的基础架构设置,#1 可能更平易近人。

    【讨论】:

    • “与其生成Chisel源代码,不如自己编写Chisel生成必要的寄存器和相关逻辑”是什么意思?你能详细说明吗?
    • 我不确定您对像 Chisel 这样的硬件生成语言有多熟悉,但基本思想是您编写生成硬件的软件。如果您有兴趣,可以查看我的 ORConf2018 关于 Chisel 和相关项目的演讲:youtube.com/watch?v=4FCZLrauDcE。如果您有兴趣学习 Chisel 本身,也可以查看 Chisel 训练营:github.com/freechipsproject/chisel-bootcamp
    【解决方案2】:

    这个问题有几种解决方法。

    你得到这个错误的原因是你的方法太大了。通常,有问题的方法是构造函数,这是该问题最常见的情况。通常,原因是过度的模式匹配(尽管它不像过去那样严重)。为了使方法更小,您需要将一些东西提取到单独的方法中。因此替换一些

    val x = (huge expression)
    

    与任一:

    def calculate_x = (huge expression)
    val x = calculate_x
    

    val x = (() => (huge expression))()
    

    甚至

    lazy val x = (huge expression)
    

    选择不会破坏或不必要地减慢您的应用程序的一个。

    【讨论】:

    • 作为最后一个选项,您可以屏蔽@Karol S 认为是巨大的表达。
    猜你喜欢
    • 2016-08-31
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2017-01-06
    相关资源
    最近更新 更多