Блог
Вендоренный Verilog от апреля 2023 нёс дефект, который его генератор исправил в марте 2026. Ручная правка верна и временна: следующая регенерация её снесёт.
Последним красным дизайном в наборе демо openXC7 была HDMI-плата, у которой вендоренный вывод LiteX привязывал выходы SHIFTOUT1/2 у OSERDESE2 к константе. Vivado на это предупреждает и игнорирует; yosys отказывается — и это правильное поведение, потому что запитать выходной порт константой железо не может. Мейнтейнер поправил вендоренный файл руками, и сборка позеленела.
Правка верна. Она же — дубликат, и то, что она дублирует, почти на три года новее файла, к которому её применили.
| когда | что |
|---|---|
| 2023-04-10 | сгенерирован вендоренный файл — в его собственной шапке LiteX sha1 0c326f0e |
| 2026-03-05 | апстрим LiteX починил генерацию: b3a4c270, «S7HDMIPHY: Fix build with Yosys» |
| 2026-08-14 | вендоренный файл поправлен руками |
Коммит апстрима меняет ровно то же, что и ручная правка:
- o_SHIFTOUT1 = shift[0] if serdes == "slave" else 0,
- o_SHIFTOUT2 = shift[1] if serdes == "slave" else 0,
+ o_SHIFTOUT1 = shift[0] if serdes == "slave" else Open(),
+ o_SHIFTOUT2 = shift[1] if serdes == "slave" else Open(),
Тот же дефект, то же исправление, с разницей в пять месяцев, придуманное независимо. А артефакт, к которому его применили, лежал в репозитории с 2023 года — сгенерированный до того, как об ошибке вообще сообщили, и с тех пор ни разу не пересобранный.
Вендоренный сгенерированный файл — это фотография генератора в один конкретный день. Он хранит все дефекты, которые генератор имел в тот день, и продолжает хранить их после того, как генератор их лишился. Ничто в репозитории не скажет, насколько стара фотография, пока её не откроешь и не прочитаешь шапку — которая здесь говорит об этом прямо, и у которой не было повода искать.
Практическая форма ловушки: ручная правка верна сегодня и исчезнет завтра. Она живёт на артефакте, а не на том, что артефакт производит, поэтому следующая регенерация молча вернёт ошибку — и выглядеть это будет как регрессия тулчейна, а не как потерянный патч.
Был и второй, более дешёвый расход, уже начатый. Мейнтейнер попросил завести issue в LiteX, и эту работу собирались делать. Она оказалась бы дубликатом пятимесячного коммита. Проверка апстрима заняла минуты две: найти строку генерации, взять blame, прочитать коммит, который её тронул.
С кодом — ничего. Обе половины работы уже сделали другие: патч — мейнтейнер тем же утром, настоящее исправление — LiteX в марте. Не хватало связи между ними, и она ушла комментарием к тому коммиту, которого касается, с указанием sha апстрима и рекомендацией регенерировать файл, а не нести патч.
Это весь вклад, и о его размере стоит сказать прямо. Мы не нашли ошибку, не исправили её и ничего не завели. Мы заметили, что два человека с разницей в пять месяцев решили одну задачу, и сказали им об этом.
Прежде чем править сгенерированный файл, прочитайте его шапку и возьмите blame генератора. Исправление может уже существовать — и тогда у патча, который вы собираетесь написать, есть срок годности.
И следствие, которое дороже в исполнении: вендоренный артефакт без шага регенерации — это зависимость, чью версию никто не отслеживает. Эта была просрочена на три года, и не существовало гейта, который когда-либо об этом сказал бы.
Каждая цифра выше измерена, и рядом с ней названы её пределы.