T27.AI

Блог

BYPASS или сломанный сдвиг: решают два бита захвата IR в JTAG

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

[одно правило из IEEE 1149.1; значение IR в записи введено руками, а не прочитано с кабеля] Наш декодер JTAG называл BYPASS любое чётное слово данных, что бы ни происходило на проводе. Способ различить уже был в стандарте: при Capture-IR каждая совместимая микросхема загружает 01 в две младшие ячейки регистра инструкций. Теперь tdo_verdict.t27 проверяет эти два бита раньше, чем смотрит на бит 0 слова данных, — 8 тестов и мутант, проваливающий 6 из них. Новый виджет выполняет те же пять проверок на любом введённом чтении.

Титульная карточка статьи, иллюстрации пока нет: BYPASS или сломанный сдвиг: решают два бита захвата IR в JTAG
Открыть титульную карточку в исходном размере
#t27#FPGA#JTAG

Декодер JTAG читает из микросхемы 32 бита и должен сказать, что они значат. Вопрос в X точно указал на наше слабое место: если у вернувшегося слова бит 0 сброшен, как отличить BYPASS от сдвига, который просто сломан? До сегодняшнего дня никак. Декодер смотрел только на слово данных, и чётное слово выглядело как BYPASS, что бы ни происходило на проводе.

Правило, которое уже было в стандарте

IEEE 1149.1 фиксирует для любого TAP одну вещь: при Capture-IR регистр инструкций загружает в две младшие ячейки двоичное 01. Значит, первые два бита из TDO после сдвига IR на любой совместимой микросхеме — 1, затем 0. Биты выше принадлежат производителю. У Xilinx 7-й серии IR шириной 6 бит, и в BSDL-файлах значение захвата записано как XXXX01, где старшие четыре — статус. Как пример такой формы мы берём 0x35 (двоичное 110101); это не значение, прочитанное с кабеля в этой сессии.

Отсюда проверка, которой не нужно знать микросхему. Если захват IR не заканчивается на 01, сдвиг сломан: такт, последовательность TMS или путь TDO. Тогда слово данных пока ничего не значит, и назвать его BYPASS — значит отправить человека загружать инструкцию по линии, которая не умеет сдвигать.

слово DR 0x13636092 (бит 0 = 0)захват IR 0x35 · младшие биты 01110101BYPASSTAP сдвигает; IDCODE не загружензахват IR 0x34 · младшие биты 00110100сломанный сдвигслово DR пока ничего не значит
Одно и то же чётное слово данных, прочитанное дважды. Если захват IR заканчивается на 01, это BYPASS: линия работает, инструкция IDCODE не загружена. Если на 00 — сломанный сдвиг. Решают два выделенных бита.

Пять проверок в строгом порядке

  1. залипание в 1: слово данных из одних единиц, TDO никто не ведёт.
  2. залипание в 0: и слово данных, и захват IR равны 0.
  3. сломанный сдвиг: захват IR не заканчивается на 01.
  4. BYPASS: захват IR заканчивается на 01, а бит 0 слова данных равен 0.
  5. IDCODE: всё остальное. Только теперь слово ищут как идентификатор микросхемы.

Весь смысл в порядке. Залипания проверяются первыми, потому что это более точный диагноз: при TDO, залипшем в 1, IR тоже читается как 0x3F, и проверка IR назвала бы это просто сломанным сдвигом, не сказав почему. Правило IR стоит раньше бита 0, поэтому чётное слово называется BYPASS только после того, как линия доказала, что умеет сдвигать.

Где живёт правило

Правило — спецификация t27: specs/port/tools/jtag/tdo_verdict.t27, маска 0x3, ожидаемое значение 0x1 и 8 тестов на случаи выше (gHashTag/t27#8032). Команда стенда tri fpga-jtag --decode WORD --ir CAPTURE печатает тот же вердикт и возвращает 0 только для настоящего IDCODE. В записи ниже — три вердикта, самопроверка, собственные тесты спецификации, а затем мутант: проверка захвата заменена на return true. Для мутанта проверка сообщает о 6 провалах, то есть тесты действительно смотрят на эту строку.

tri fpga-jtag --ir · захват IR должен заканчиваться на 01

Семь команд за 30.2 с; каждая строка оболочки возвращает 0. Сам декодер печатает exit 0 для настоящего IDCODE и exit 1 для BYPASS и сломанного сдвига. Дальше самопроверка; tdo_verdict.t27 — 8 тестов и 8 утверждений без ошибок; мутант, который проваливает 6 проверок. Открыть запись на отдельной странице.

Проверьте на своём чтении

Виджет JTAG verdict на t27.ai/widgets/jtag-verdict/ выполняет те же пять проверок прямо на странице. Введите захват IR и слово данных, которые прочитал ваш пробник, или выберите один из семи тестовых векторов спецификации — виджет покажет, какая проверка решила, на какие биты она смотрела, и команду tri, которая печатает тот же ответ. Значения остаются на странице, с кабеля ничего не читается. Для слова, прошедшего как IDCODE, виджет ведёт в декодер IDCODE, который разбирает 32 бита по полям.

Чего это не показывает

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

Пруфы

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

Нужно довести FPGA/RTL-задачу до замеров на железе?

Работаю по контракту и part-time с hardware-AI, FPGA/RTL и ML-системами — от спецификации и открытого тулчейна до воспроизводимых измерений.