
nextpnr портативный инструмент для размещения и трассировки FPGA
nextpnr — портативный инструмент для размещения и трассировки FPGA ===================================================== nextpnr стремится быть независимым от вендора, управляемым по таймингам, свободным инструментом для размещения и трассировки FPGA. В настоящее время nextpnr поддерживает: * Устройства Lattice iCE40, поддерживаемые [Project IceStorm](https://github.com/YosysHQ/icestorm) * Устройства Lattice ECP5, поддерживаемые [Project Trellis](https://github.com/YosysHQ/prjtrellis) * Устройства Lattice Nexus, поддерживаемые [Project Oxide](https://github.com/gatecat/prjoxide) * Устройства Gowin LittleBee и Aurora V, поддерживаемые [Project Apicula](https://github.com/YosysHQ/apicula) * Устройства NanoXplore NG-Ultra, поддерживаемые [Project Beyond](https://github.com/YosysHQ-GmbH/prjbeyond-db) * Устройства Cologne Chip GateMate, поддерживаемые [Project Peppercorn](https://github.com/YosysHQ/prjpeppercorn) * *(экспериментально)* Устройства Cyclone V, поддерживаемые [Mistral](https://github.com/Ravenslofty/mistral) * *(экспериментально)* Устройства Lattice MachXO2, поддерживаемые [Project Trellis](https://github.com/YosysHQ/prjtrellis) * *(экспериментально)* Устройства Xilinx 7-й серии, поддерживаемые [Project X-Ray](https://github.com/F4PGA/prjxray) * *(экспериментально)* «универсальный» бэкенд для пользовательских архитектур Краткая (академическая) статья, описывающая поток Yosys+nextpnr, доступна на [arXiv](https://arxiv.org/abs/1903.10407). Ниже приведён скриншот nextpnr для iCE40. Инструкции по сборке и [заметки для начала работы](#начало-работы) можно найти далее. <img src="https://assets.kitploit.com/production/public/readmes/10385/12bab50b683472060ad2a49530d9b6fe58b2c2b70efd1144b849ff83a8a6e80b.png" width="640"/> См. также: - [Часто задаваемые вопросы](https://github.com/yosyshq/nextpnr/blob/main/docs/faq.md) - [API архитектуры](https://github.com/yosyshq/nextpnr/blob/main/docs/archapi.md) Предварительные требования -------------------------- Для сборки nextpnr, независимо от выбранной архитектуры, необходимо установить следующие пакеты: - CMake 3.25 или новее - Современный компилятор C++17 (для разработки требуется `clang-format`) - Python 3.5 или новее, включая библиотеки для разработки (`python3-dev` для Ubuntu) - Для `nextpnr-himbaechel` требуется Python 3.9 или новее - В Windows убедитесь, что установлена версия, поддерживаемая [vcpkg](https://github.com/Microsoft/vcpkg/blob/master/ports/python3/CONTROL) - Библиотеки Boost (`libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev` или `libboost-all-dev` для Ubuntu) - Eigen3 (`libeigen3-dev` для Ubuntu) - Yosys требуется для синтеза демонстрационного дизайна - Для сборки в Windows с MSVC рекомендуется использовать vcpkg для установки зависимостей. - Для 32-битных сборок: `vcpkg install boost-filesystem boost-program-options boost-thread eigen3` - Для 64-битных сборок: `vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windows` - Для статических сборок добавьте `-static` к каждому имени пакета. Например, замените `eigen3:x64-windows` на `eigen3:x64-windows-static` - Копия Python, соответствующая версии в vcpkg (в настоящее время Python 3.6.4). Вы можете скачать [Встраиваемый ZIP-файл](https://www.python.org/downloads/release/python-364/) и распаковать его. Возможно, потребуется извлечь `python36.zip` из встраиваемого zip-файла в новую директорию с именем «Lib». - Для сборки на macOS потребуется утилита brew. - Установите все необходимые пакеты: `brew install cmake python boost eigen` Начало работы ------------- Прежде всего выполните: ``` git submodule update --init --recursive ``` ### nextpnr-ice40 Для поддержки iCE40 установите [Project IceStorm](https://github.com/YosysHQ/icestorm) в `/usr/local` или другое место, которое следует передать в CMake как `-DICESTORM_INSTALL_PREFIX=/usr`. Затем соберите и установите `nextpnr-ice40` с помощью следующих команд: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 make -j$(nproc) sudo make install ``` В Windows можно явно указать пути: ``` cmake . -B build -DARCH=ice40 -DICESTORM_INSTALL_PREFIX=C:/ProgramData/icestorm -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -G "Visual Studio 15 2017 Win64" -DPython3_EXECUTABLE=C:/Python364/python.exe -DPython3_LIBRARY=C:/vcpkg/packages/python3_x64-windows/lib/python36.lib -DPython3_INCLUDE_DIR=C:/vcpkg/packages/python3_x64-windows/include/python3.6 cmake --build build --config Release ``` Для статической сборки измените triplet с `x64-windows` на `x64-windows-static` и добавьте `-DBUILD_STATIC=ON`. Простой пример, который работает на отладочной плате iCEstick, можно найти в `ice40/examples/blinky/blinky.*`. Пример использования: ``` cd ice40/examples/blinky yosys -p 'synth_ice40 -top blinky -json blinky.json' blinky.v # синтез в blinky.json nextpnr-ice40 --hx1k --json blinky.json --pcf blinky.pcf --asc blinky.asc # размещение и трассировка icepack blinky.asc blinky.bin # генерация битового потока iceprog blinky.bin # загрузка дизайна на iCEstick ``` Запуск nextpnr в режиме GUI (см. ниже инструкции по сборке nextpnr с поддержкой GUI): ``` nextpnr-ice40 --json blinky.json --pcf blinky.pcf --asc blinky.asc --gui ``` (Используйте кнопки панели инструментов или консоль команд Python для выполнения действий, таких как упаковка, размещение, трассировка и запись выходных файлов.) ### nextpnr-ecp5 Для поддержки ECP5 установите [Project Trellis](https://github.com/YosysHQ/prjtrellis) в `/usr/local` или другое место, которое следует передать в CMake как `-DTRELLIS_INSTALL_PREFIX=/usr/local`. Затем соберите и установите `nextpnr-ecp5` с помощью следующих команд: ``` mkdir -p build && cd build cmake .. -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install ``` - Примеры потока ECP5 для различных плат можно найти в [Project Trellis Examples](https://github.com/YosysHQ/prjtrellis/tree/main/examples). ### nextpnr-nexus Для поддержки Nexus установите [Project Oxide](https://github.com/gatecat/prjoxide) в `$HOME/.cargo` или другое место, которое следует передать в CMake как `-DOXIDE_INSTALL_PREFIX=$HOME/.cargo`. Затем соберите и установите `nextpnr-nexus` с помощью следующих команд: ``` mkdir -p build && cd build cmake .. -DARCH=nexus -DOXIDE_INSTALL_PREFIX=$HOME/.cargo make -j$(nproc) sudo make install ``` - Примеры потока Nexus для различных плат можно найти в [Project Oxide Examples](https://github.com/gatecat/prjoxide/tree/main/examples). ### nextpnr-mistral Для поддержки Cyclone V клонируйте [Mistral](https://github.com/Ravenslofty/mistral/tree/nextpnr-latest) в `$HOME/mistral` или другое место и передайте этот путь в CMake как `-DMISTRAL_ROOT=$HOME/mistral`. Затем соберите и установите `nextpnr-mistral` с помощью следующих команд: ``` mkdir -p build && cd build cmake .. -DARCH=mistral -DMISTRAL_ROOT=$HOME/mistral make -j$(nproc) sudo make install ``` Поддержка Cyclone V в настоящее время является экспериментальной и имеет ограниченное тестирование. Бэкенд находится в процессе активного рефакторинга API, его структура, требования к сборке и точки интеграции могут меняться между версиями. ### nextpnr-generic Универсальная цель позволяет выполнять размещение и трассировку для произвольных пользовательских архитектур. ``` mkdir -p build && cd build cmake .. -DARCH=generic make -j$(nproc) sudo make install ``` Пример использования универсального потока находится в [generic/examples](https://github.com/yosyshq/nextpnr/blob/main/generic/examples). См. также [документацию по универсальной архитектуре](https://github.com/yosyshq/nextpnr/blob/main/docs/generic.md). ### nextpnr-himbaechel Цель himbaechel позволяет выполнять размещение и трассировку для более крупных архитектур, имеющих общую структуру. #### gowin Для поддержки Gowin установите [Project Apicula](https://github.com/YosysHQ/apicula) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin" make -j$(nproc) sudo make install ``` - Примеры потока Gowin для различных плат можно найти в [Project Apicula Examples](https://github.com/YosysHQ/apicula/tree/master/examples). #### ng-ultra Для поддержки NanoXplore NG-Ultra клонируйте репозиторий [Project Beyond DB](https://github.com/yosyshq-GmbH/prjbeyond-db) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="ng-ultra" -DHIMBAECHEL_PRJBEYOND_DB=/path/to/prjbeyond-db -DHIMBAECHEL_NGULTRA_DEVICES=ng-ultra make -j$(nproc) sudo make install ``` *Обратите внимание, что для создания двоичного битового потока требуется инструмент Impulse от NanoXplore.* #### gatemate Для поддержки Cologne Chip GateMate клонируйте [Project Peppercorn](https://github.com/YosysHQ/prjpeppercorn) ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gatemate" -DHIMBAECHEL_PEPPERCORN_PATH=/path/to/prjpeppercorn make -j$(nproc) sudo make install ``` ### GUI Графический интерфейс nextpnr не собирается по умолчанию, чтобы уменьшить количество зависимостей для стандартной сборки без графического интерфейса. Чтобы включить его, добавьте `-DBUILD_GUI=ON` в командную строку CMake и убедитесь, что Qt5/Qt6 и OpenGL доступны: Для Qt6: - В Ubuntu 22.04 LTS или новее установите `qt6-base-dev` - Для MSVC vcpkg установите `qt-base` (32-битная) или `qt-base:x64-windows` (64-битная) - Для Homebrew установите `qt6` и добавьте qt6 в путь: `echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` ` — это изменение вступит в силу в следующем сеансе терминала, поэтому перед сборкой откройте новое окно терминала Для Qt5: - В Ubuntu 22.04 LTS установите `qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools` - В других версиях Ubuntu установите `qt5-default` - Для MSVC vcpkg установите `qt5-base` (32-битная) или `qt5-base:x64-windows` (64-битная) - Для Homebrew установите `qt5` и добавьте qt5 в путь: `echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` ` — это изменение вступит в силу в следующем сеансе терминала, поэтому перед сборкой откройте новое окно терминала ### Несколько архитектур Чтобы собрать nextpnr сразу для нескольких архитектур, можно использовать список, разделённый точкой с запятой, в `-DARCH`. ``` mkdir -p build && cd build cmake .. -DARCH="ice40;ecp5" make -j$(nproc) sudo make install ``` Чтобы собрать все доступные стабильные архитектуры, используйте `-DARCH=all`. Чтобы включить экспериментальные архитектуры (в настоящее время nexus), используйте `-DARCH=all+alpha`. ### Разделение по микроархитектурам Himbächel Чтобы собрать отдельный исполняемый файл `nextpnr-himbaechel` для каждой из поддерживаемых микроархитектур, используйте `-DHIMBAECHEL_SPLIT`. ``` mkdir -p build && cd build cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin;ng-ultra" make -j$(nproc) sudo make install ``` В такой сборке вместо одного двоичного файла `nextpnr-himbaechel` будут созданы два: `nextpnr-himbaechel-gowin` и `nextpnr-himbaechel-ng-ultra`. Хотя они устанавливаются вместе, каждая микроархитектура полностью независима от другой и для работы требует только соответствующего каталога базы данных микросхем `.../share/himbaechel/<микроархитектура>/`. Раздельная сборка уменьшает размер отдельных распространяемых артефактов (хотя общий размер увеличивается) и позволяет совместно устанавливать артефакты разных версий. Кросс-компиляция ---------------- Помимо баз данных микросхем, nextpnr требует, чтобы инструмент `bba` был скомпилирован для целевой системы сборки. Этот инструмент можно скомпилировать как отдельный проект: ``` cd bba cmake . make ``` Это создаст файл `bba-export.cmake`. Укажите путь к этому файлу при кросс-сборке nextpnr, используя `-DBBA_IMPORT=/path/to/bba-export.cmake`. Дополнительные замечания по сборке nextpnr ------------------------------------------ Следующая команда выполняет отладочную сборку архитектуры iCE40 без GUI, без поддержки Python, без аналитического разместителя HeAP и только с поддержкой HX1K: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 -DCMAKE_BUILD_TYPE=Debug -DBUILD_PYTHON=OFF -DICE40_DEVICES=1k make -j$(nproc) ``` Для статической сборки релиза архитектуры iCE40 используйте следующее: ``` mkdir -p build && cd build cmake .. -DARCH=ice40 -DBUILD_PYTHON=OFF -DSTATIC_BUILD=ON make -j$(nproc) ``` Решатель разместителя HeAP при необходимости может использовать OpenMP для ускорения работы с очень большими проектами. Включите это, передав `-DUSE_OPENMP=yes` в cmake (поддержка компилятора может различаться). Вы можете изменить место установки nextpnr (по умолчанию обычно `/usr/local`), используя `-DCMAKE_INSTALL_PREFIX=/install/prefix`. Заметки для разработчиков ------------------------- - Весь код форматируется с помощью `clang-format` в соответствии с правилами стиля в `.clang-format` (на основе LLVM с увеличенной шириной отступов и размещением фигурных скобок после классов). - Чтобы автоматически отформатировать весь исходный код, выполните `make clangformat`. - См. вики для дополнительной документации по API архитектуры. Запись видео ------------ - Чтобы сохранить видеозапись процесса размещения и трассировки, нажмите значок записи на панели инструментов и выберите пустую директорию, где будут храниться файлы записи, а также укажите количество пропускаемых кадров. - Вручную запустите все необходимые операции PnR - Снова нажмите на значок записи, чтобы остановить запись - Перейдите в директорию с файлами и выполните `ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4` Тестирование ------------ - Чтобы также собрать тестовые двоичные файлы, используйте `-DBUILD_TESTS=ON` и после `make` выполните `make test` для их запуска, или вы можете запустить отдельные двоичные файлы. - Чтобы использовать санитайзеры кода, используйте параметры `cmake`: - `-DSANITIZE_ADDRESS=ON` - `-DSANITIZE_MEMORY=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++` - `-DSANITIZE_THREAD=ON` - `-DSANITIZE_UNDEFINED=ON` - Пример запуска valgrind: `valgrind --leak-check=yes --tool=memcheck ./nextpnr-ice40 --json ice40/blinky.json` - Для запуска тестов с покрытием кода используйте `-DBUILD_TESTS=ON -DCOVERAGE` и после `make` выполните `make ice40-coverage` - После этого откройте `ice40-coverage/index.html` в вашем браузере, чтобы просмотреть отчёт о покрытии - Обратите внимание, что для создания отчётов требуется `lcov` Ссылки и дополнительные материалы --------------------------------- ### Синтез, моделирование и логическая оптимизация - [Yosys](https://yosyshq.net/yosys/) - [Icarus Verilog](http://iverilog.icarus.com/) - [ABC](https://people.eecs.berkeley.edu/~alanmi/abc/) ### Проекты по документированию (и инструментам) битовых потоков FPGA - [Project IceStorm (Lattice iCE40)](https://github.com/YosysHQ/icestorm) - [Project Trellis (Lattice ECP5)](https://yosyshq.github.io/prjtrellis-db/) - [Project X-Ray (Xilinx 7-Series)](https://github.com/F4PGA/prjxray) - [Project Chibi (Intel MAX-V)](https://github.com/rqou/project-chibi) ### Другие свободные проекты размещения и трассировки FPGA - [Arachne PNR](https://github.com/cseed/arachne-pnr) - [VPR/VTR](https://verilogtorouting.org/) - [SymbiFlow](https://github.com/SymbiFlow/symbiflow-arch-defs)