EdigE
← ЛЕНТА

RISC-V пережил смену FPGA-плат благодаря трём слоям RTL

На Nexys A7-100T однотактная RV32I-система упёрлась в путь от асинхронной памяти инструкций через процессорную логику: при образе до 32 КБ он не укладывался в 100 МГц. Частоту пришлось снизить до 10 МГц. При этом сам процессорный проект не стали переделывать под плату: в BGM его отделяют от железа слоями `lab_top.sv` и `board_specific_top.sv`, меняя обвязку там, где плата диктует свои правила.

Нижний слой знает реальные выводы FPGA, активные уровни LED, генератор, число кнопок, разрядность RGB и доступные индикаторы. `lab_top` задаёт интерфейс конкретной лабораторной работы: ей могут понадобиться переключатели, звук, экран или светодиоды. Выше остаётся RTL самого упражнения и процессорной системы. Такая раскладка не обещает неизменный SoC для любой цели, зато сразу показывает место изменений и не разносит особенности платы по всему проекту.

VGA потребовал переделать логику, а не распиновку

Сторонняя учебная система АПС на `rv32i_zicsr` хорошо проверила эту схему. У неё были отдельные памяти инструкций и данных, фиксированные 16-битные switch и LED, восьмиразрядный семисегментный индикатор и символьный VGA 80×30. Формально порты видеовыхода существовали с обеих сторон, однако они описывали разные действия. Исходная система сама формировала RGB и синхросигналы, а BGM передавал текущие координаты `x/y` в пользовательскую логику и ждал RGB в ответ. Координаты пришлось довести до VGA-контроллера: простая таблица соответствия портов здесь дала бы неверную картинку.

Генератор тоже нельзя спрятать за красивым именем `clk`. Показанный в проекте делитель получает входную частоту выше целевой и кратную ей; для ровной скважности отношение должно быть чётным. Поэтому найденные на платах 12, 50 или 100 МГц меняют доступный набор системных частот. В случае Nexys ограничение до 10 МГц связано именно с длинным критическим путём однотактного ядра и асинхронного чтения instruction memory, а не с абстрактной «медленностью» FPGA.

Тактовый генератор и BRAM меняют поведение системы

HepoH, Habr

Ещё один скрытый источник несовместимости появляется в inferred BRAM. Для Gowin и других потоков автор использовал разные RTL-ветки. При одновременной записи и чтении одна оставляет прежнее значение на выходе, что соответствует `NO_CHANGE`; другая выдаёт старое содержимое памяти, то есть `READ_FIRST`. В интегрированной RV32I-системе это допустимо, поскольку выход чтения не используется в такт записи. В кэше, кадровом буфере либо двухпортовом FIFO такое отличие способно поменять поведение схемы без единой ошибки в распиновке.

BGM сводит выбор цели и запуск сборки к сценариям `06_choose_another_fpga_board.bash` и `03_synthesize_for_fpga.bash`; за ними стоят разные цепочки синтеза, place-and-route и прошивки для Intel/Altera, Gowin, Lattice и Xilinx. Репозиторий перечисляет несколько десятков вариантов плат и внешних модулей, от I²S до HDMI и LCD. Эта таблица помечена как work in progress, поэтому она не доказывает одинаковые utilisation, STA или частоты для всех целей.

Скрипт скрывает toolchain, но не свойства кристалла

Три слоя не отменяют физику платы. Проект должен поместиться в LUT, FF и BRAM, получить нужный клок и реальные выводы; отсутствующие органы ввода или дисплей придётся переназначить, добавить внешним модулем либо исключить из упражнения. Зато каждое такое решение остаётся в видимой части RTL. Смена FPGA превращается в работу с конкретными сигналами, памятью и таймингом, а не в рискованный переписыванием всего процессорного проекта.