Блог
[один дизайн, один ноутбук при нагрузке 12,6 на 8 ядрах; цифры L1 и L2 — потолки по Амдалу, а не результаты; часы в год опираются на названные допущения] Мы засекли каждый слой одной настоящей сборки XC7A200T через openXC7. Синтез занял 12,7 с, размещение и разводка 70,1 с, FASM в кадры 33,9 с, кадры в битстрим 0,2 с, всего 116,9 с. С двумя слоями, уже пересобранными из t27-спеков, flow занимает 83,5 с, в 1,40 раза быстрее, и битстрим совпадает байт в байт. Размещение и разводка теперь 60% сборки: если бы они не занимали времени, flow был бы в 8,75 раза быстрее, а мгновенный синтез упирается в 1,65 раза. Числа — в записанной терминальной сессии. В релизе tri этих инструментов пока нет.
В прошлом посте мы пересобрали заднюю половину openXC7 из t27-спеков. FASM в кадры и кадры в битстрим теперь получаются из спеков, байт в байт. Отсюда следующий вопрос: сколько стоило бы сделать то же самое для каждого слоя flow? Чтобы ответить, мы засекли каждый слой одной настоящей сборки и поставили числа рядом.
Дизайн — trinet_node_v2_ax7203 для xc7a200tfbg484-2 на плате AX7203, 121 587 строк FASM. Команда tri devkit flow --build запускает flow openXC7 с замером каждого шага. Затем она трижды запускает t27-замены на том же FASM и сравнивает их вывод с выводом openXC7 байт в байт. Время — секунды по часам на одном ноутбуке при нагрузке 12,6 на 8 ядрах.
| Слой | Инструмент openXC7 | Сейчас | Доля | t27 | Те же байты |
|---|---|---|---|---|---|
| L1 Синтез | yosys | 12,69 с | 10,9 % | пока нет | – |
| L2 Размещение и разводка | nextpnr-xilinx | 70,09 с | 60,0 % | пока нет | – |
| L3 FASM → кадры | fasm2frames.py | 33,86 с | 29,0 % | bitwalk --fasm 0,42 с | да |
| L4 Кадры → .bit | xc7frames2bit | 0,22 с | 0,2 % | bitwalk --write 0,25 с | да |
| Весь flow | 116,86 с | 83,45 с (1,40×) |
tri devkit · the FPGA flow, layer by layer
tri devkit flow --build и tri devkit impact. Каждый напечатанный байт настоящий и появляется тогда, когда появился; приглашение и набор команд постановочные, паузы длиннее 2 с сокращены, и пока это происходит, в заголовке окна стоит пометка. Сама запись на английском. Открыть запись на отдельной странице.Переписанное на сегодня экономит 33,4 с на этой сборке, и всё это в L3. L4 — ничья: bitwalk --write занял 0,25 с против 0,22 с у xc7frames2bit. Битстрим в обоих случаях один и тот же файл, так что это более быстрый путь к тому же результату, а не лучший результат.
После L3 размещение и разводка — 60,0 % сборки, синтез — 10,9 %. Закон Амдала даёт максимум, который мог бы дать переписанный любой из них: пусть слой занимает 0 с, и посмотрим, что останется.
| Если бы это заняло 0 с | Flow | Против openXC7 сегодня |
|---|---|---|
| L1 Синтез | 83,5 с → 70,8 с | 1,65× |
| L2 Размещение и разводка | 83,5 с → 13,4 с | 8,75× |
Значит, следующий рычаг — размещение и разводка, с большим отрывом. Синтез из спеков, даже мгновенный, ограничивает весь flow 1,65×. Это потолки, а не планы. nextpnr-xilinx — большая зрелая программа на C++, и реалистичный путь — работа внутри неё (мы уже отправляем туда патчи) плюс проверяемые спеками правила тайминга и разводки, а не переписывание с нуля.
tri devkit impact переводит экономию в часы. При допущении 20 сборок в день у одного человека за 230 рабочих дней 33,4 с на сборку — это 42,7 часа ожидания в год. Число сборок и людей — допущения, поэтому страница t27.ai/#/devkit даёт подставить свои.
Пока нет. Прогон выше сделан локальной сборкой tri devkit, а bitwalk собран из открытого pull request, gHashTag/t27#5609. Ни того, ни другого нет в релизе tri, поэтому команды установки здесь нет. Оба должны войти в архивы релиза tri с установкой одной строкой; эта работа ведётся в github.com/gHashTag/trinity/issues/1272, и команда появится в посте, когда она будет в релизе.
Поработаем вместе
Работаю по контракту и part-time с hardware-AI, FPGA/RTL и ML-системами — от спецификации и открытого тулчейна до воспроизводимых измерений.