
nextpnr nextpnr-0.11
nextpnr portables FPGA-Platzierungs- und Verdrahtungswerkzeug
nextpnr – ein portables FPGA-Platzierungs- und Routing-Tool
nextpnr zielt darauf ab, ein herstellerneutrales, zeitgesteuertes Open-Source-FPGA-Platzierungs- und Routing-Tool zu sein.
Derzeit unterstützt nextpnr:
- Lattice iCE40-Geräte, die von Project IceStorm unterstützt werden
- Lattice ECP5-Geräte, die von Project Trellis unterstützt werden
- Lattice Nexus-Geräte, die von Project Oxide unterstützt werden
- Gowin LittleBee- und Aurora V-Geräte, die von Project Apicula unterstützt werden
- NanoXplore NG-Ultra-Geräte, die von Project Beyond unterstützt werden
- Cologne Chip GateMate-Geräte, die von Project Peppercorn unterstützt werden
- (experimentell) Cyclone V-Geräte, die von Mistral unterstützt werden
- (experimentell) Lattice MachXO2-Geräte, die von Project Trellis unterstützt werden
- (experimentell) Xilinx 7-Series-Geräte, die von Project X-Ray unterstützt werden
- (experimentell) ein „generisches“ Backend für benutzerdefinierte Architekturen
Ein kurzes (wissenschaftliches) Paper, das den Yosys+nextpnr-Ablauf beschreibt, finden Sie auf arXiv.
Hier ist ein Screenshot von nextpnr für iCE40. Bauanleitungen und Erste-Schritte-Hinweise finden Sie unten.
Siehe auch:
Voraussetzungen
Die folgenden Pakete müssen zum Erstellen von nextpnr installiert sein, unabhängig von der gewählten Architektur:
- CMake 3.25 oder neuer
- Moderner C++17-Compiler (
clang-formatwird für die Entwicklung benötigt) - Python 3.5 oder neuer, einschließlich Entwicklungsbibliotheken (
python3-devfür Ubuntu)- Python 3.9 oder neuer ist für
nextpnr-himbaechelerforderlich - unter Windows stellen Sie sicher, dass Sie die gleiche Version wie von vcpkg unterstützt installieren
- Python 3.9 oder neuer ist für
- Boost-Bibliotheken (
libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-devoderlibboost-all-devfür Ubuntu) - Eigen3 (
libeigen3-devfür Ubuntu) - Yosys wird zur Synthese des Demo-Designs benötigt
- Für das Erstellen unter Windows mit MSVC wird die Verwendung von vcpkg für die Abhängigkeitsinstallation empfohlen.
- Für 32-Bit-Builds:
vcpkg install boost-filesystem boost-program-options boost-thread eigen3 - Für 64-Bit-Builds:
vcpkg install boost-filesystem:x64-windows boost-program-options:x64-windows boost-thread:x64-windows eigen3:x64-windows - Für statische Builds fügen Sie jedem Paketnamen
-statichinzu. Ändern Sie beispielsweiseeigen3:x64-windowsineigen3:x64-windows-static - Eine Kopie von Python, die zur Version in vcpkg passt (derzeit Python 3.6.4). Sie können die Embeddable Zip-Datei herunterladen und entpacken. Möglicherweise müssen Sie
python36.zipinnerhalb der embeddable zip-Datei in ein neues Verzeichnis namens „Lib“ extrahieren.
- Für 32-Bit-Builds:
- Für das Erstellen unter macOS wird das brew-Dienstprogramm benötigt.
- Installieren Sie alle benötigten Pakete:
brew install cmake python boost eigen
- Installieren Sie alle benötigten Pakete:
Erste Schritte
Führen Sie zunächst Folgendes aus:
git submodule update --init --recursive
nextpnr-ice40
Für iCE40-Unterstützung installieren Sie Project IceStorm nach /usr/local oder an einen anderen Ort, der als -DICESTORM_INSTALL_PREFIX=/usr an CMake übergeben werden sollte. Erstellen und installieren Sie dann nextpnr-ice40 mit den folgenden Befehlen:
mkdir -p build && cd build
cmake .. -DARCH=ice40
make -j$(nproc)
sudo make install
Unter Windows können Sie Pfade explizit angeben:
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
Um einen statischen Release zu erstellen, ändern Sie das Ziel-Triplett von x64-windows in x64-windows-static und fügen Sie -DBUILD_STATIC=ON hinzu.
Ein einfaches Beispiel, das auf dem iCEstick-Entwicklungsboard läuft, finden Sie in ice40/examples/blinky/blinky.*.
Nutzungsbeispiel:
cd ice40/examples/blinky
yosys -p 'synth_ice40 -top blinky -json blinky.json' blinky.v # Synthese in blinky.json
nextpnr-ice40 --hx1k --json blinky.json --pcf blinky.pcf --asc blinky.asc # Platzierung und Routing durchführen
icepack blinky.asc blinky.bin # Binäre Bitstream-Datei erzeugen
iceprog blinky.bin # Design auf iCEstick hochladen
Ausführen von nextpnr im GUI-Modus (siehe unten für Anweisungen zum Erstellen von nextpnr mit GUI-Unterstützung):
nextpnr-ice40 --json blinky.json --pcf blinky.pcf --asc blinky.asc --gui
(Verwenden Sie die Symbolleistenschaltflächen oder die Python-Befehlskonsole, um Aktionen wie Packen, Platzieren, Routen und Schreiben von Ausgabedateien durchzuführen.)
nextpnr-ecp5
Für ECP5-Unterstützung installieren Sie Project Trellis nach /usr/local oder an einen anderen Ort, der als -DTRELLIS_INSTALL_PREFIX=/usr/local an CMake übergeben werden sollte. Erstellen und installieren Sie dann nextpnr-ecp5 mit den folgenden Befehlen:
mkdir -p build && cd build
cmake .. -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
- Beispiele für den ECP5-Ablauf für eine Reihe von Boards finden Sie in den Project Trellis Examples.
nextpnr-nexus
Für Nexus-Unterstützung installieren Sie Project Oxide nach $HOME/.cargo oder an einen anderen Ort, der als -DOXIDE_INSTALL_PREFIX=$HOME/.cargo an CMake übergeben werden sollte. Erstellen und installieren Sie dann nextpnr-nexus mit den folgenden Befehlen:
mkdir -p build && cd build
cmake .. -DARCH=nexus -DOXIDE_INSTALL_PREFIX=$HOME/.cargo
make -j$(nproc)
sudo make install
- Beispiele für den Nexus-Ablauf für eine Reihe von Boards finden Sie in den Project Oxide Examples.
nextpnr-mistral
Für Cyclone V-Unterstützung klonen Sie Mistral nach $HOME/mistral oder einen anderen Ort und übergeben Sie diesen Pfad als -DMISTRAL_ROOT=$HOME/mistral an CMake. Erstellen und installieren Sie dann nextpnr-mistral mit den folgenden Befehlen:
mkdir -p build && cd build
cmake .. -DARCH=mistral -DMISTRAL_ROOT=$HOME/mistral
make -j$(nproc)
sudo make install
Die Cyclone V-Unterstützung ist derzeit experimentell und nur begrenzt getestet. Das Backend durchläuft eine aktive API-Umstrukturierung, und seine Struktur, Build-Anforderungen und Integrationspunkte können sich zwischen Versionen ändern.
nextpnr-generic
Das generische Ziel ermöglicht die Ausführung von Platzierung und Routing für beliebige benutzerdefinierte Architekturen.
mkdir -p build && cd build
cmake .. -DARCH=generic
make -j$(nproc)
sudo make install
Ein Beispiel zur Verwendung des generischen Ablaufs finden Sie in generic/examples. Siehe auch die Generic Architecture docs.
nextpnr-himbaechel
Das himbaechel-Ziel ermöglicht die Ausführung von Platzierung und Routing für größere Architekturen, die eine gemeinsame Struktur teilen.
gowin
Für Gowin-Unterstützung installieren Sie Project Apicula
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin"
make -j$(nproc)
sudo make install
- Beispiele für den Gowin-Ablauf für eine Reihe von Boards finden Sie in den Project Apicula Examples.
ng-ultra
Für NanoXplore NG-Ultra-Unterstützung klonen Sie das Project Beyond DB Repository
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
Bitte beachten Sie, dass die Erstellung des binären Bitstreams das Impulse-Tool von NanoXplore erfordert.
gatemate
Für Cologne Chip GateMate-Unterstützung klonen Sie 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
GUI
Die nextpnr-GUI wird standardmäßig nicht erstellt, um die Anzahl der Abhängigkeiten für einen normalen Headless-Build zu reduzieren. Um sie zu aktivieren, fügen Sie -DBUILD_GUI=ON zur CMake-Befehlszeile hinzu und stellen Sie sicher, dass Qt5/Qt6 und OpenGL verfügbar sind:
Für Qt6:
- Unter Ubuntu 22.04 LTS oder neuer installieren Sie
qt6-base-dev - Für MSVC vcpkg installieren Sie
qt-base(32-Bit) oderqt-base:x64-windows(64-Bit) - Für Homebrew installieren Sie
qt6und fügen Sie qt6 zum Pfad hinzu:echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` - diese Änderung wird in der nächsten Terminalsitzung wirksam, daher bitte vor dem Erstellen das Terminalfenster erneut öffnen
Für Qt5:
- Unter Ubuntu 22.04 LTS installieren Sie
qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools - Unter anderen Ubuntu-Versionen installieren Sie
qt5-default - Für MSVC vcpkg installieren Sie
qt5-base(32-Bit) oderqt5-base:x64-windows(64-Bit) - Für Homebrew installieren Sie
qt5und fügen Sie qt5 zum Pfad hinzu:echo 'export PATH="/usr/local/opt/qt/bin:$PATH"' >> ~/.bash_profile` - diese Änderung wird in der nächsten Terminalsitzung wirksam, daher bitte vor dem Erstellen das Terminalfenster erneut öffnen
Mehrere Architekturen
Um nextpnr für mehrere Architekturen gleichzeitig zu erstellen, kann eine semikolonseparierte Liste mit -DARCH verwendet werden.
mkdir -p build && cd build
cmake .. -DARCH="ice40;ecp5"
make -j$(nproc)
sudo make install
Um jede verfügbare stabile Architektur zu erstellen, verwenden Sie -DARCH=all. Um experimentelle Architekturen (derzeit nexus) einzuschließen, verwenden Sie -DARCH=all+alpha.
Pro-Mikroarchitektur-Himbächel
Um für jede unterstützte Mikroarchitektur eine einzelne nextpnr-himbachel ausführbare Datei zu erstellen, verwenden Sie -DHIMBAECHEL_SPLIT.
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin;ng-ultra"
make -j$(nproc)
sudo make install
In einem solchen Build werden anstelle einer einzelnen Binärdatei nextpnr-himbaechel zwei Binärdateien nextpnr-himbaechel-gowin und nextpnr-himbaechel-ng-ultra erstellt. Obwohl sie zusammen installiert werden, ist jede Mikroarchitektur völlig unabhängig von der anderen und benötigt nur ihr entsprechendes .../share/himbaechel/<Mikroarchitektur>/-Chipdatenbankverzeichnis, um ausgeführt zu werden. Der Split-Build reduziert die Größe einzelner verteilter Artefakte (obwohl die Gesamtgröße zunimmt) und ermöglicht die Koinstallation von Artefakten verschiedener Versionen.
Cross-Kompilierung
Neben den Chip-Datenbanken benötigt nextpnr das Tool bba, das für das Build-System kompiliert werden muss. Dieses Tool kann als separates Projekt kompiliert werden:
cd bba
cmake .
make
Dadurch wird eine Datei bba-export.cmake erstellt. Geben Sie den Pfad zu dieser Datei an, wenn Sie nextpnr cross-kompilieren, indem Sie -DBBA_IMPORT=/path/to/bba-export.cmake verwenden.
Zusätzliche Hinweise zum Erstellen von nextpnr
Das Folgende führt einen Debug-Build der iCE40-Architektur ohne GUI, ohne Python-Unterstützung, ohne den HeAP-analytischen Placer und nur mit HX1K-Unterstützung durch:
mkdir -p build && cd build
cmake .. -DARCH=ice40 -DCMAKE_BUILD_TYPE=Debug -DBUILD_PYTHON=OFF -DICE40_DEVICES=1k
make -j$(nproc)
Um einen statischen Build-Release für die iCE40-Architektur zu erstellen, verwenden Sie Folgendes:
mkdir -p build && cd build
cmake .. -DARCH=ice40 -DBUILD_PYTHON=OFF -DSTATIC_BUILD=ON
make -j$(nproc)
Der Solver des HeAP-Placers kann optional OpenMP für eine Beschleunigung bei sehr großen Designs verwenden. Aktivieren Sie dies, indem Sie -DUSE_OPENMP=yes an cmake übergeben (Compiler-Unterstützung kann variieren).
Sie können den Installationsort von nextpnr ändern (standardmäßig /usr/local) mit -DCMAKE_INSTALL_PREFIX=/install/prefix.
Hinweise für Entwickler
- Der gesamte Code wird mit
clang-formatgemäß den Stilregeln in.clang-formatformatiert (LLVM-basiert mit größeren Einzugsbreiten und geschweiften Klammern nach Klassen). - Um automatisch den gesamten Quellcode zu formatieren, führen Sie
make clangformataus. - Weitere Dokumentation zur Architektur-API finden Sie im Wiki.
Aufnahme eines Films
- Um eine Filmaufnahme der Platzierung und des Routings zu speichern, klicken Sie in der Symbolleiste auf das Aufnahmesymbol und wählen Sie ein leeres Verzeichnis aus, in dem die Aufnahmedateien gespeichert werden, und wählen Sie die zu überspringenden Frames aus.
- Starten Sie manuell alle gewünschten PnR-Operationen
- Klicken Sie erneut auf das Aufnahmesymbol, um die Aufnahme zu stoppen
- Gehen Sie zu dem Verzeichnis mit den Dateien und führen Sie
ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4aus
Tests
- Um auch Test-Binärdateien zu erstellen, verwenden Sie
-DBUILD_TESTS=ONund führen Sie nachmakemake testaus, um sie auszuführen, oder Sie können separate Binärdateien ausführen. - Um Code-Sanitizer zu verwenden, verwenden Sie die
cmake-Optionen:-DSANITIZE_ADDRESS=ON-DSANITIZE_MEMORY=ON -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++-DSANITIZE_THREAD=ON-DSANITIZE_UNDEFINED=ON
- Beispiel für die Ausführung von valgrind:
valgrind --leak-check=yes --tool=memcheck ./nextpnr-ice40 --json ice40/blinky.json - Ausführen von Tests mit Code Coverage verwenden Sie
-DBUILD_TESTS=ON -DCOVERAGEund führen Sie nachmakemake ice40-coverageaus - Öffnen Sie anschließend
ice40-coverage/index.htmlin Ihrem Browser, um den Coverage-Bericht anzuzeigen - Beachten Sie, dass
lcovzum Generieren von Berichten erforderlich ist
Links und Referenzen
Synthese, Simulation und Logikoptimierung
FPGA-Bitstream-Dokumentations- (und Tool-) Projekte
- Project IceStorm (Lattice iCE40)
- Project Trellis (Lattice ECP5)
- Project X-Ray (Xilinx 7-Series)
- Project Chibi (Intel MAX-V)