T27.AI

Блог

Три кристалла, один вердикт: проверка на кремнии, которую прогоняют один раз

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

[пока одна спецификация; две квитанции из трёх у одного оператора; CI ещё не пропускает проверку на кремнии по квитанции] Одна спецификация t27, ternary_link, проверена на трёх разных кристаллах ПЛИС на трёх машинах, одной из них управляли за 410 мс, и ответы совпали. Каждый кристалл назван своим DNA и подписал ответ на один запрос; run-record признаёт прогон пригодным для ссылок (INDEP_DIES). Второй кристалл нашёл ошибку, которую первый найти не мог. Главное: когда на вердикт на железе можно сослаться, правило из reuse.t27 позволяет прогнать проверку один раз на версию спецификации и инструментов, а остальным проверить квитанции за секунды.

Гравюрный триптих к статье: Три кристалла, один вердикт: проверка на кремнии, которую прогоняют один раз
Открыть полный триптих в исходном размере
#t27#FPGA#Verification

Одна спецификация t27 теперь проверена на трёх разных кристаллах ПЛИС, на трёх машинах, и все три ответа совпали. Каждый кристалл назван своим заводским DNA. Каждый подписал ответ на один и тот же одноразовый запрос. Наша утилита run-record признаёт результат пригодным для ссылок. Это R3-3, и он меняет цену проверки на железе: её можно прогнать один раз на версию и дальше использовать готовый результат, а не повторять в каждой сборке.

Что прогоняли

Спецификация — specs/fpga/ternary_link.t27. t27c 0.5.1 превращает её в битстрим открытой цепочкой (yosys, nextpnr-xilinx, prjxray), загружает в SRAM ПЛИС и читает ответ по JTAG: 0xa5a532bd, все четыре условия истинны, ok=1. Перед этим каждый прогон загружает битстрим для чужого чипа, и кристалл обязан его отвергнуть (Done 0). Эта проверка не даёт пройти плате, которая отвечает «да» на всё подряд.

[измерено] Кристалл A, 050d58218fd9854, стоит на стенде владельца. Кристалл B, 0389c0c2d85e85c, — на стенде оператора B. Кристалл C, 050a5824d85e85c, — на ПК Фила. Все три ответили на запрос проверяющего e61798b7…, и каждую квитанцию подписал ключ машины, которая вела прогон. run-record читает три квитанции за секунды: прогон полный, все свежие, каждый кристалл назван, независимость INDEP_DIES, на прогон можно ссылаться.

Кристаллом C управляли за 410 мс

Плата Фила стоит на ПК с Windows без инструментов для ПЛИС. Вместо того чтобы ставить их там, Linux-лаборатория оператора B взяла только его JTAG-кабель, по USB/IP внутри закрытой сети Tailscale. Сначала на это открыто согласились Фил, его собственный Claude и владелец (t27#7669). При задержке 410 мс загрузка битстрима шла около 70 минут, весь прогон — около 2,5 часа. Первая попытка увидела пустую JTAG-цепочку: плата была подключена по USB, но без блока питания на 12 В.

Второй кристалл нашёл ошибку, которую первый найти не мог

Кристалл B прочитал свой DNA, но квитанция пришла без него. Наша спецификация ждала, что последние 7 бит DNA в копии из eFUSE равны 0x4F. Это было верно только для кристалла A, у B там 0x37. По одному кристаллу нельзя увидеть, что константа на самом деле своя у каждого кристалла. Исправление (t27#7761) вошло в t27c 0.5.1, и все три квитанции сделаны уже им.

Почему это ускоряет сборку для всех

В specs/verified/reuse.t27 уже записано, когда собранный артефакт можно взять готовым, а не пересобирать. Должны совпасть пять частей: байты спецификации, печати всего, что она импортирует, инструменты, настройки сборки и вердикт PASS. Часть, которая не была записана, считается отличающейся. Для программной части это уже работает: CI тестирует только те спецификации, которые может задеть изменение (specs/ci/affected.t27).

Для железа слабым местом была пятая часть. PASS на одной плате мог означать удачную плату, перепутанный стенд или ошибку, которую скрывает только один кристалл, как только что показал кристалл B. R3-3 — первый вердикт на железе, достаточно сильный для этой пятой части: три разных кристалла, свежие подписанные квитанции и запись о прогоне, на которую может сослаться вердикт.

[измерено] На местном стенде проверка ternary_link на кремнии стоит около минуты размещения и трассировки (60,75 с на кристалле A) плюс загрузка. Удалённо она заняла часы. Когда вердикт пригоден для ссылок, проверку нужно прогнать один раз на версию спецификации и инструментов, а не в каждой сборке, на каждой машине и у каждого участника. Остальные проверяют квитанции, а это секунды. Чем больше спецификаций получат такие прогоны, тем сильнее цена проверки изменения будет зависеть от того, что изменение задевает, а не от размера всего корпуса.

Чего пока нет

Пока это одна спецификация. CI ещё не пропускает проверку на кремнии по ссылке на квитанцию: подключить reuse.t27 к конвейеру — следующий шаг. Кристаллы B и C подписаны ключами с машин одного оператора, поэтому прогон достигает INDEP_DIES, а не INDEP_OPERATORS. И DNA кристалла — это имя, а не секрет, так что ни одна квитанция здесь не опирается на сам кристалл как на корень доверия.

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

Пруфы

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

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

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