Любой способ обойти ограничения размера JVM-кода, спотыкаемый большим файлом Chisel

Просто скажите, что вы автоматически генерировали некоторый код долота для некоторой инфраструктуры в вашем чипе. Одиночный файл, в котором создается загрузка регистров с отображенной памятью, а затем назначаются операции ввода-вывода.

Затем, скажем, однажды вы добавляете дополнительный регистр, и JVM срывается и больше не хочет его строить из-за предельного размера метода aribtrary 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 модуля.

Это работало очень хорошо для нас, но теперь, кажется, maxxed, что довольно раздражает.

Кто-нибудь сталкивался с этим раньше? Это будет работа, чтобы разбить это на несколько блоков регистров (и больше аппаратных средств, имеющих теперь несколько шинных интерфейсов на pbus), поэтому буду признателен, если кто-нибудь знает способ обойти это.

1 ответ

Я полагаю, что такое же ограничение приводит к разбиению таблиц декодирования ракетных чипов на несколько классов.

К сожалению, я не думаю, что есть простой обходной путь, так как это историческая ошибка проектирования в самой JVM. Я могу придумать 2 способа решения проблемы, но я думаю, что любой из них - это немного работы:

  1. Есть ли у вас генератор разделить логику создания реестра на методы

  2. Вместо того, чтобы генерировать исходный код Chisel, напишите сам Chisel для генерации необходимых регистров и соответствующей логики

#2, вероятно, является верным путем ™, но #1 может быть более доступным, учитывая вашу текущую настройку инфраструктуры.

Есть несколько способов решения этой проблемы.

Причина, по которой вы получаете эту ошибку, заключается в том, что ваш метод слишком велик. Часто рассматриваемый метод является конструктором, который является наиболее распространенным случаем для проблемы. Часто причиной является чрезмерное сопоставление с образцом (хотя это не такая большая проблема, как раньше). Чтобы сделать метод меньше, вам нужно выделить некоторые вещи в отдельные методы. Поэтому заменить некоторые

val x = (huge expression)

либо с:

def calculate_x = (huge expression)
val x = calculate_x

или же

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

или даже

lazy val x = (huge expression)

Выберите тот, который не сломает или излишне замедлит ваше приложение.

Другие вопросы по тегам