解决大型Chisel文件绊倒的JVM代码大小限制的任何方法

时间:2018-11-27 02:48:24

标签: scala jvm chisel rocket-chip

只需说您正在为芯片中的某些基础结构自动生成一些Chisel代码。一个文件,先实例化内存映射寄存器的加载,然后实例化IO分配。

然后说,有一天,您添加了一个额外的寄存器,并且由于JVM中64k方法的限制大小,JVM崩溃了,不想再构建它了:

[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端口或从模块的io端口分配。

这对我们来说效果很好,但现在看来已经不堪重负了。

有没有人遇到过这个?将其分解为多个寄存器块(以及更多的硬件,现在在pbus上具有多个总线接口)将是一项工作,因此如果有人知道解决方法,将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

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

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

  2. 而不是生成Chisel源代码,而是编写Chisel自身以生成必要的寄存器和相关逻辑

#2可能是正确的方式™,但考虑到当前的基础架构设置,#1可能更容易接近。

答案 1 :(得分:0)

有几个解决此问题的方法。

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

SELECT
    A.[Week Income],
    A.[Year],
    A.[Total] - B.[Total Salary] AS [Balance]
    ...
 FROM (           
    SELECT
        DATEPART( week, dbo.Income.IncomeDate ) AS [Week Income],
        DATEPART( YEAR, dbo.Income.IncomeDate ) AS [Year],
        SUM ( dbo.Income.CardAmount ) AS [Total Card],
        SUM ( dbo.Income.CashAmount ) AS [Total Cash],
        SUM ( dbo.Income.TipsAmount ) AS [Total Tip],
        SUM ( dbo.Income.SalaryAmount ) AS [Total Salary],
        SUM ( dbo.Income.Adjustment ) AS [Total Adjustment] 
    FROM
        dbo.Income 
    GROUP BY
        DATEPART( week, dbo.Income.IncomeDate ),
        DATEPART( YEAR, dbo.Income.IncomeDate ) 
 ) AS A 
 LEFT JOIN (  
    SELECT
        DATEPART( wk, dbo.Transactions.PaymentMadeOn ) AS [Week],
        COUNT (DATEPART( wk, dbo.Transactions.PaymentMadeOn )) AS [Expenses Count],
        DATEPART( YEAR, dbo.Transactions.PaymentMadeOn ) AS [Year],
        SUM ( dbo.Transactions.PaymentAmount ) AS [Total] 
    FROM
        dbo.Transactions 
    GROUP BY
        DATEPART( wk, dbo.Transactions.PaymentMadeOn ),
        DATEPART( YEAR, dbo.Transactions.PaymentMadeOn ) 
  ) AS B ON A.[Week Income] = B.[Week] AND A.[Year] = B.[Year]
ORDER BY
    A.[Year],
    A.[Week Income]

使用以下任一方法:

val x = (huge expression)

def calculate_x = (huge expression)
val x = calculate_x

甚至

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

选择一个不会损坏或不必要降低应用速度的应用程序。