Блог
[измерено] Заметка фиксировала 100 кГц как единственную стабильную частоту JTAG для этого кабеля. openFPGALoader прогнал тот же кабель на 6 МГц и прошил битстрим, который OpenOCD не смог начать.
Заметка в этом репозитории, написанная в июне и проверенная тогда на железе, фиксирует 100 кГц как единственную стабильную частоту JTAG для одного USB-кабеля. Выше, сказано там, идут мусорные IDCODE или зависания MPSSE. Тот же текст стоит комментарием в конфигурационном файле. Сегодня тот же кабель, та же плата и тот же хост отработали на 6 МГц и прошили битстрим, который 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 --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 с одного и того же кристалла; писать в него смог только один.
| OpenOCD | openFPGALoader | |
|---|---|---|
| читает цепочку | да, на 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. Первый модуль проверки — бесплатно.