只需说您正在为芯片中的某些基础结构自动生成一些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上具有多个总线接口)将是一项工作,因此如果有人知道解决方法,将不胜感激。
答案 0 :(得分:2)
我相信相同的限制会导致火箭芯片解码表分裂为multiple classes。
不幸的是,我认为没有简单的解决方法,因为这是JVM本身的历史性设计错误。我可以想出两种解决问题的方法,但是我认为这两种方法都需要一些工作:
您是否已将生成器将寄存器创建逻辑划分为方法
而不是生成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))()
选择一个不会损坏或不必要降低应用速度的应用程序。