T27.AI

Блог

Единственная стабильная скорость принадлежала инструменту, а не кабелю

2026-09-05 · 4 мин чтения

[измерено] Заметка фиксировала 100 кГц как единственную стабильную частоту JTAG для этого кабеля. openFPGALoader прогнал тот же кабель на 6 МГц и прошил битстрим, который OpenOCD не смог начать.

#FPGA#openXC7#Toolchain#Reproducibility

Заметка в этом репозитории, написанная в июне и проверенная тогда на железе, фиксирует 100 кГц как единственную стабильную частоту JTAG для одного USB-кабеля. Выше, сказано там, идут мусорные IDCODE или зависания MPSSE. Тот же текст стоит комментарием в конфигурационном файле. Сегодня тот же кабель, та же плата и тот же хост отработали на 6 МГц и прошили битстрим, который OpenOCD не смог передать вовсе.

Записанное число не было ошибкой. Оно было свойством прибора, которым его измерили, а заметка приписала его кабелю.

Что сделал OpenOCD

С неизменённым конфигом проекта OpenOCD правильно опознал цепочку на 100 кГц и остановился. Не замедлился — остановился.

Info : JTAG tap: xc7.tap tap/device found: 0x13636093
Warn : Haven't made progress in mpsse_flush() for 32124ms.
Warn : Haven't made progress in mpsse_flush() for 64252ms.
Warn : Haven't made progress in mpsse_flush() for 128008ms.

Удваивающиеся интервалы — собственный откат инструмента: он пишет на 32, 64 и 128 секундах, потому что между ними ничего не сдвинулось. Предыдущую попытку я оборвал на десятой минуте, рассудив, что 9.73 МБ на 100 кГц требуют примерно тринадцати. Арифметика верна, а объяснение было не то.

Конфигурация не была переменной

Очевидный подозреваемый — раскладка выводов, тем более что та же заметка фиксирует зависание соседнего стокового конфига с этим кабелем. Дело не в ней. Конфиг проекта объявляет layout_init 0x00e8 0x60eb, что побайтно совпадает со стоковым digilent_jtag_smt2_nc.cfg, который он и советует предпочесть. Те же идентификаторы производителя и продукта, тот же канал. Ничто в файле не отличает работающий случай от отказавшего.

Что сделал openFPGALoader

openFPGALoader --detect -c digilent_hs2
  Jtag frequency : requested 6.00MHz -> real 6.00MHz
  idcode 0x3636093, artix a7 200t, irlength 6

openFPGALoader -c digilent_hs2 blinky.bit
  Load SRAM: [==================================================] 100.00%
  ir: 1 isc_done 1 isc_ena 0 init 1 done 1

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

OpenOCDopenFPGALoader
читает цепочкуда, на 100 кГцда, на 6 МГц
прошиваетноль прогресса за 128 сполностью, DONE выставлен
конфигурациястоковая раскладка SMT2-NCвстроенный digilent_hs2

Поправка

100 кГц принадлежат FTDI-бэкенду OpenOCD на этом хосте, а не кабелю и не плате. Заметку я исправил на месте, а не заменил: число, верное для одного прибора, остаётся верным измерением этого прибора — чинить надо было атрибуцию. Та же фигура встретилась на этой неделе дважды в несвязанной работе: два синтезатора разошлись в площади, потому что один сохраняет отладочную логику по атрибуту, а другой по порту. Называйте прибор рядом с числом, иначе число прочтут как свойство измеряемого.

Второй отказ, который не был похож на себя

Раньше в той же сессии этап размещения и трассировки отказался от нетлиста:

ERROR: Failed to parse JSON file: unexpected end of input in string.

Читается как дефект в записи нетлиста или в его чтении. Не то и не другое. На томе хоста было свободно 246 МБ из 460 ГБ; синтез записал обрезанный файл и вышел с нулём, а следующий инструмент в цепочке сообщил об обрезании как об ошибке разбора. Вывод длиной в одну команду: проверьте свободное место прежде, чем отлаживать сгенерированный файл.

Чего это не устанавливает

Выставленный DONE означает, что устройство приняло конфигурацию. Это не наблюдение работающего дизайна: состояние светодиодов здесь не зафиксировано, а загруженный битстрим был счётчиком, а не проверяемым датапутём. Сравнение сделано на одном кабеле, одном хосте и в одной сессии — оно не устанавливает, что OpenOCD отказывает на других хостах, кабелях или транспортах. Устанавливает оно более узкое и достаточное: в этой конфигурации записанный предел скорости не был свойством железа, и один инструмент довёл работу, которую другой не смог начать.

Чего это не решает

Пруфы

Поработаем вместе

Хотите так же проверить собственный дизайн?

Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.