CERN собрал FIFO и CDC в библиотеку для разных FPGA
В отладочной прошивке один тактовый домен уже записывает слова в FIFO после reset, другой ещё не получил ни одного фронта clock. Указатели должны пережить эту асимметрию, флаги full и empty — остаться честными, а метастабильность не должна просочиться в логику. Обычная симуляция легко пропускает именно такое сочетание редких событий. Затем этот же узел копируют в следующий проект, меняют ширину шины, глубину буфера и полагаются на память автора о том, что когда-то он уже работал.
Блок, который обязан пережить редкий reset
CERN пытается убрать эту рутину библиотекой colibri. Это открытый набор VHDL-2008 компонентов для FPGA, в котором собраны FIFO между тактовыми доменами, синхронизаторы CDC, буферы, подавители дребезга, память и потоковая обвязка. В публичном релизе заявлено более 100 RTL-компонентов. Ранняя документация LHCb фиксировала 57 компонентов, поэтому эти числа описывают разные срезы быстро растущего проекта.
В библиотеку также вошли арбитры, маршрутизаторы и broadcaster-блоки для потоков, скремблеры, gearboxes, RLE-кодирование, I²C, SPI, UART, преобразователи Avalon↔AXI, Ethernet и Aurora 64b/66b. Такой перечень сам по себе не превращает прошивку в конструктор: инженер всё равно задаёт частоты, параметры очередей, правила backpressure и ограничения тайминга. Зато базовый узел получает единый интерфейс и проверочную обвязку вместо очередной локальной версии с неизвестной историей угловых случаев.
Проверка входит в состав IP
Смысл colibri именно в этой обвязке. Для компонентов предусмотрены самопроверяющиеся testbench, а там, где размер задачи позволяет, — formal-harnesses. Формальная проверка особенно уместна для FIFO и CDC-логики: она ищет последовательности состояний, которые тест автор мог никогда не сгенерировать. При этом у метода есть физический предел вычислений. Широкие тракты и крупные памяти раздувают пространство состояний, глубину проверки приходится ограничивать, поэтому фраза «fully verified» на странице проекта не означает доказательство любой конфигурации каждого блока.
Проект заявлен как vendor-independent и отмечен тегами Vivado, Quartus, Lattice, Gowin и Efinix. Переносимость здесь относится к чистому VHDL-ядру. SERDES, DDR, PCIe, pin constraints и hard IP по-прежнему привязаны к кристаллу и его инструментам. Но FIFO, синхронизатор импульса или AXI-мост обычно и являются тем слоем, который хочется вынести из этой привязки без потери дисциплины проверки.
Переносимость заканчивается у hard IP
Для DAQ-проектов такая библиотека особенно своевременна: один и тот же набор очередей, маршрутизаторов и интерфейсных переходов кочует между платами годами. Материалы CERN показывают, что colibri уже использовали в практикуме по DAQ-прошивке, включая constrained-random testbench и formal verification. Библиотека распространяется по CERN Open Hardware Licence — Weakly Reciprocal 2.0; CERN сообщает о применении в LHCb и более чем десяти проектах.
Источники и документы: CERN EP Department, «colibri: CERN VHDL Common Library released for Everyone to Use», https://ep-news.web.cern.ch/colibri-cern-vhdl-common-library-released-for-everyone-to-use/ ; репозиторий colibri, https://gitlab.com/colibri-cern/colibri ; LHCb, «Guidelines for FPGA Gateware Development in LHCb», https://inspirehep.net/files/c85e48121212c3bbd5a557f6df7afc96 ; CERN Indico, практикум «DAQ Firmware Design with the colibri VHDL library», https://indico.cern.ch/event/1688253/.