
nextpnr strumento portatile per posizionamento e instradamento FPGA
nextpnr mira ad essere uno strumento di place and route per FPGA FOSS, neutrale rispetto al fornitore e guidato dal timing.
Attualmente nextpnr supporta:
Un breve articolo (accademico) che descrive il flusso Yosys+nextpnr può essere trovato su arXiv.
Ecco uno screenshot di nextpnr per iCE40. Le istruzioni di compilazione e le note per iniziare si trovano qui sotto.
Vedi anche:
I seguenti pacchetti devono essere installati per compilare nextpnr, indipendentemente dall'architettura selezionata:
clang-format richiesto per lo sviluppo)python3-dev per Ubuntu)
nextpnr-himbaechellibboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev o libboost-all-dev per Ubuntu)libeigen3-dev per Ubuntu)vcpkg install boost-filesystem boost-program-options boost-thread eigen3vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windowsPrima di tutto, esegui:
git submodule update --init --recursive
Per il supporto iCE40, installa Project IceStorm in /usr/local o in un'altra posizione, che dovrebbe essere passata come -DICESTORM_INSTALL_PREFIX=/usr a CMake. Quindi compila e installa nextpnr-ice40 usando i seguenti comandi:
mkdir -p build && cd build
cmake .. -DARCH=ice40
make -j$(nproc)
sudo make install
Su Windows, puoi specificare i percorsi esplicitamente:
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
Per compilare una release statica, cambia il triplet di destinazione da x64-windows a x64-windows-static e aggiungi -DBUILD_STATIC=ON.
Un semplice esempio che funziona sulla scheda di sviluppo iCEstick può essere trovato in ice40/examples/blinky/blinky.*.
Esempio di utilizzo:
cd ice40/examples/blinky
yosys -p 'synth_ice40 -top blinky -json blinky.json' blinky.v # sintetizza in blinky.json
nextpnr-ice40 --hx1k --json blinky.json --pcf blinky.pcf --asc blinky.asc # esegui place and route
icepack blinky.asc blinky.bin # genera il file bitstream binario
iceprog blinky.bin # carica il design su iCEstick
Esecuzione di nextpnr in modalità GUI (vedi sotto per le istruzioni su come compilare nextpnr con supporto GUI):
nextpnr-ice40 --json blinky.json --pcf blinky.pcf --asc blinky.asc --gui
(Usa i pulsanti della barra degli strumenti o la console dei comandi Python per eseguire azioni come pack, place, route e scrivere file di output.)
Per il supporto ECP5, installa Project Trellis in /usr/local o in un'altra posizione, che dovrebbe essere passata come -DTRELLIS_INSTALL_PREFIX=/usr/local a CMake. Quindi compila e installa nextpnr-ecp5 usando i seguenti comandi:
mkdir -p build && cd build
cmake .. -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
Per il supporto Nexus, installa Project Oxide in $HOME/.cargo o in un'altra posizione, che dovrebbe essere passata come -DOXIDE_INSTALL_PREFIX=$HOME/.cargo a CMake. Quindi compila e installa nextpnr-nexus usando i seguenti comandi:
mkdir -p build && cd build
cmake .. -DARCH=nexus -DOXIDE_INSTALL_PREFIX=$HOME/.cargo
make -j$(nproc)
sudo make install
Per il supporto Cyclone V, clona Mistral in $HOME/mistral o in un'altra posizione e passa questo percorso come -DMISTRAL_ROOT=$HOME/mistral a CMake. Quindi compila e installa nextpnr-mistral usando i seguenti comandi:
mkdir -p build && cd build
cmake .. -DARCH=mistral -DMISTRAL_ROOT=$HOME/mistral
make -j$(nproc)
sudo make install
Il supporto per Cyclone V è attualmente sperimentale e ha test limitati. Il backend è in fase di refactoring attivo dell'API e la sua struttura, i requisiti di compilazione e i punti di integrazione possono cambiare tra le versioni.
Il target generico permette di eseguire place and route per architetture personalizzate arbitrarie.
mkdir -p build && cd build
cmake .. -DARCH=generic
make -j$(nproc)
sudo make install
Un esempio di come utilizzare il flusso generico si trova in generic/examples. Vedi anche la documentazione dell'architettura generica.
Il target himbaechel permette di eseguire place and route per architetture più grandi che condividono una struttura comune.
Per il supporto Gowin, installa Project Apicula
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin"
make -j$(nproc)
sudo make install
Per il supporto NanoXplore NG-Ultra, clona il repository Project Beyond 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
Si prega di notare che la creazione del bitstream binario richiede lo strumento Impulse di NanoXplore.
Per il supporto Cologne Chip GateMate, clona Project Peppercorn
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gatemate" -DHIMBAECHEL_PEPPERCORN_PATH=/path/to/prjpeppercorn
make -j$(nproc)
sudo make install
La GUI di nextpnr non viene compilata per impostazione predefinita, per ridurre il numero di dipendenze per una build headless standard. Per abilitarla, aggiungi -DBUILD_GUI=ON alla riga di comando di CMake e assicurati che Qt5/Qt6 e OpenGL siano disponibili:
Per Qt6:
qt6-base-devqt-base (32-bit) o qt-base:x64-windows (64-bit)qt6 e aggiungi qt6 nel percorso: echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile
` - questa modifica è effettiva nella prossima sessione del terminale, quindi riapri la finestra del terminale prima di compilarePer Qt5:
qtbase5-dev qtchooser qt5-qmake qtbase5-dev-toolsqt5-defaultqt5-base (32-bit) o qt5-base:x64-windows (64-bit)qt5 e aggiungi qt5 nel percorso: echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile
` - questa modifica è effettiva nella prossima sessione del terminale, quindi riapri la finestra del terminale prima di compilarePer compilare nextpnr per più architetture contemporaneamente, è possibile utilizzare un elenco separato da punto e virgola con -DARCH.
mkdir -p build && cd build
cmake .. -DARCH="ice40;ecp5"
make -j$(nproc)
sudo make install
Per compilare ogni architettura stabile disponibile, usa -DARCH=all. Per includere architetture sperimentali (attualmente nexus), usa -DARCH=all+alpha.
Per compilare un singolo eseguibile nextpnr-himbaechel per ciascuna delle microarchitetture supportate, usa -DHIMBAECHEL_SPLIT.
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin;ng-ultra"
make -j$(nproc)
sudo make install
In tale build, invece di un singolo binario nextpnr-himbaechel, vengono compilati due binari nextpnr-himbaechel-gowin e nextpnr-himbaechel-ng-ultra. Sebbene siano installati insieme, ogni microarchitettura è completamente indipendente dall'altra e necessita solo della corrispondente directory del database dei chip .../share/himbaechel/<microarchitettura>/ per essere eseguita. La build separata riduce la dimensione dei singoli artefatti distribuiti (sebbene la dimensione totale aumenti) e consente la co-installazione di artefatti di versioni diverse.
Oltre ai database dei chip, nextpnr richiede che lo strumento bba sia compilato per il sistema di build. Questo strumento può essere compilato come progetto separato:
cd bba
cmake .
make
Questo creerà un file bba-export.cmake. Fornisci il percorso a questo file quando cross-compili nextpnr usando -DBBA_IMPORT=/percorso/di/bba-export.cmake.
Quanto segue esegue una build di debug dell'architettura iCE40 senza GUI, senza supporto Python, senza il placer analitico HeAP e solo supporto HX1K:
mkdir -p build && cd build
cmake .. -DARCH=ice40 -DCMAKE_BUILD_TYPE=Debug -DBUILD_PYTHON=OFF -DICE40_DEVICES=1k
make -j$(nproc)
Per creare una build statica release per l'architettura iCE40 usa quanto segue:
mkdir -p build && cd build
cmake .. -DARCH=ice40 -DBUILD_PYTHON=OFF -DSTATIC_BUILD=ON
make -j$(nproc)
Il risolutore del placer HeAP può opzionalmente utilizzare OpenMP per un'accelerazione su progetti molto grandi. Abilitalo passando -DUSE_OPENMP=yes a cmake (il supporto del compilatore può variare).
Puoi cambiare la posizione in cui verrà installato nextpnr (di solito predefinita in /usr/local) usando -DCMAKE_INSTALL_PREFIX=/percorso/di/installazione.
clang-format secondo le regole di stile in .clang-format (basato su LLVM con larghezze di indentazione aumentate e parentesi graffe dopo le classi).make clangformat.ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4-DBUILD_TESTS=ON e dopo make esegui make test per eseguirli, oppure puoi eseguire binari separati.cmake:
-DSANITIZE_ADDRESS=ON-DSANITIZE_MEMORY=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++-DSANITIZE_THREAD=ON-DSANITIZE_UNDEFINED=ONvalgrind --leak-check=yes --tool=memcheck ./nextpnr-ice40 --json ice40/blinky.json-DBUILD_TESTS=ON -DCOVERAGE e dopo make esegui make ice40-coverage-static a ciascun nome di pacchetto. Ad esempio, cambia eigen3:x64-windows in eigen3:x64-windows-staticpython36.zip all'interno del file zip incorporabile in una nuova directory chiamata "Lib".brew install cmake python boost eigenice40-coverage/index.html nel tuo browser per visualizzare il rapporto di coperturalcov è necessario per generare i rapporti