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

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

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

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

Ответы [ 2 ]

0 голосов
/ 08 января 2019

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

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

val x = (huge expression)

на:

def calculate_x = (huge expression)
val x = calculate_x

или

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

или даже

lazy val x = (huge expression)

Выберите тот, который выигралне ломать или неоправданно замедлять работу приложения.

0 голосов
/ 27 ноября 2018

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

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

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

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

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

...