EdigE
← ЛЕНТА

fpgacapZero прячет переносной логический анализатор внутрь FPGA

Отладка FPGA начинается с неприятного превращения: сигнал, который ещё минуту назад был понятным именем в RTL, после синтеза оказывается глубоко внутри кристалла. Его можно вывести наружу пином, пожертвовав разводкой, либо вставить фирменный ILA и привязать проект к набору IP, серверу и интерфейсу производителя. fpgacapZero пытается оставить прибор внутри самого дизайна и пользоваться единственным уже имеющимся выходом — JTAG.

JTAG как выход из закрытого прибора

В проект вставляются RTL-ядра fcapz, а JTAG доставляет команды и захваченные данные на хост. Базовый ELA наблюдает внутренние шины, ждёт триггер и сохраняет выборки в BRAM. Захват выгружается в VCD, CSV или JSON; на компьютере доступны CLI, Python API, JSON-RPC, браузерный интерфейс с просмотрщиком Surfer и GUI на PySide6. Для транспорта подходят OpenOCD с распространёнными JTAG-адаптерами, Vivado hw_server или Quartus.

Из этой схемы вырастает более интересная вещь, чем универсальный waveform viewer. В HDL можно зафиксировать точки наблюдения, имена каналов и сценарий захвата рядом с проверяемым блоком. При переносе дизайна на другую FPGA сохраняются сам ELA и программа, которая разбирает его данные. Меняется тонкий слой, соединяющий ядро с JTAG TAP конкретного семейства.

Переносимость упирается в реальную матрицу поддержки

В текущем README такие wrappers заявлены для AMD/Xilinx 7-series и UltraScale(+), Intel/Altera, Lattice ECP5, Gowin и Microchip PolarFire. Аппаратно весь путь уже проверен на Arty A7-100T, Gowin BRS-100-GW1NR9 и DE25-Nano с Agilex 5. Для UltraScale, ECP5 и PolarFire RTL готов, однако host-to-hardware проверка пока ограничена. Efinix в актуальной матрице остаётся planned/pending, хотя раннее описание проекта обещало поддержку.

Малый ELA 8 бит на 1024 отсчёта автор оценивает примерно в 600 LUT и половину блока BRAM. Триггеры, timestamps, децимация и сегментированный захват включаются при сборке, поэтому простое наблюдение короткой шины не обязано тащить весь набор функций. Эта оценка пока остаётся данными разработчика: опубликованных сопоставимых отчётов synthesis и place-and-route для нескольких семейств нет.

Кабель прошивки получает доступ к живому железу

Остальные ядра расширяют назначение JTAG. EIO читает и меняет сигналы fabric во время работы. EJTAG-UART выводит консоль без выделенного UART-пина. EJTAG-AXI формирует AXI4-транзакции: через кабель прошивки можно читать карту регистров периферии, остановившийся DMA или состояние собственного IP-блока, даже если CPU ещё не поднял firmware. Скорость такого канала скромна, зато он остаётся доступен в самых ранних и самых сломанных состояниях платы.

Есть и реальный воспроизводимый пример: проект BrisbaneSilicon для Gowin BRS-100-GW1NR9 собирает ELA в битстрим, подключается через OpenOCD и сохраняет VCD. В опубликованном вызове probe видны шесть каналов, 8-битная ширина выборки и глубина 64. Это подтверждает живой маршрут для одной Gowin-платы, но ещё не измеряет влияние ядер на Fmax, пропускную способность длинных захватов и устойчивость тракта на каждом заявленном семействе.

Публичный запуск зрелого инструмента

Публичный выпуск появился 20 сентября 2026 года, хотя сам проект старше: OpenOCD backend обсуждался ещё 13 апреля, а интеграция с Gowin была опубликована в мае. Поэтому fpgacapZero — не сырой анонс, а уже выросший инструмент. Он не отменяет фирменные средства для глубокого bring-up кристалла, но делает отладочные крючки частью переносимого HDL — примерно так, как testbench давно стал частью исходников.