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 давно стал частью исходников.