
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](https://github.com/YosysHQ/icestorm) unterstützt werden * Lattice ECP5-Geräte, die von [Project Trellis](https://github.com/YosysHQ/prjtrellis) unterstützt werden * Lattice Nexus-Geräte, die von [Project Oxide](https://github.com/gatecat/prjoxide) unterstützt werden * Gowin LittleBee- und Aurora V-Geräte, die von [Project Apicula](https://github.com/YosysHQ/apicula) unterstützt werden * NanoXplore NG-Ultra-Geräte, die von [Project Beyond](https://github.com/YosysHQ-GmbH/prjbeyond-db) unterstützt werden * Cologne Chip GateMate-Geräte, die von [Project Peppercorn](https://github.com/YosysHQ/prjpeppercorn) unterstützt werden * *(experimentell)* Cyclone V-Geräte, die von [Mistral](https://github.com/Ravenslofty/mistral) unterstützt werden * *(experimentell)* Lattice MachXO2-Geräte, die von [Project Trellis](https://github.com/YosysHQ/prjtrellis) unterstützt werden * *(experimentell)* Xilinx 7-Series-Geräte, die von [Project X-Ray](https://github.com/F4PGA/prjxray) 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](https://arxiv.org/abs/1903.10407). Hier ist ein Screenshot von nextpnr für iCE40. Bauanleitungen und [Erste-Schritte-Hinweise](#getting-started) finden Sie unten. <img src="https://assets.kitploit.com/production/public/readmes/10385/12bab50b683472060ad2a49530d9b6fe58b2c2b70efd1144b849ff83a8a6e80b.png" width="640"/> Siehe auch: - [F.A.Q.](https://github.com/yosyshq/nextpnr/blob/main/docs/faq.md) - [Architecture API](https://github.com/yosyshq/nextpnr/blob/main/docs/archapi.md) 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-format` wird für die Entwicklung benötigt) - Python 3.5 oder neuer, einschließlich Entwicklungsbibliotheken (`python3-dev` für Ubuntu) - Python 3.9 oder neuer ist für `nextpnr-himbaechel` erforderlich - unter Windows stellen Sie sicher, dass Sie die gleiche Version wie von [vcpkg](https://github.com/Microsoft/vcpkg/blob/master/ports/python3/CONTROL) unterstützt installieren - Boost-Bibliotheken (`libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev` oder `libboost-all-dev` für Ubuntu) - Eigen3 (`libeigen3-dev` fü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 `-static` hinzu. Ändern Sie beispielsweise `eigen3:x64-windows` in `eigen3: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](https://www.python.org/downloads/release/python-364/) herunterladen und entpacken. Möglicherweise müssen Sie `python36.zip` innerhalb der embeddable zip-Datei in ein neues Verzeichnis namens „Lib“ extrahieren. - Für das Erstellen unter macOS wird das brew-Dienstprogramm benötigt. - Installieren Sie alle benötigten Pakete: `brew install cmake python boost eigen` 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](https://github.com/YosysHQ/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](https://github.com/YosysHQ/prjtrellis) 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](https://github.com/YosysHQ/prjtrellis/tree/main/examples). ### nextpnr-nexus Für Nexus-Unterstützung installieren Sie [Project Oxide](https://github.com/gatecat/prjoxide) 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](https://github.com/gatecat/prjoxide/tree/main/examples). ### nextpnr-mistral Für Cyclone V-Unterstützung klonen Sie [Mistral](https://github.com/Ravenslofty/mistral/tree/nextpnr-latest) 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](https://github.com/yosyshq/nextpnr/blob/main/generic/examples). Siehe auch die [Generic Architecture docs](https://github.com/yosyshq/nextpnr/blob/main/docs/generic.md). ### 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](https://github.com/YosysHQ/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](https://github.com/YosysHQ/apicula/tree/master/examples). #### ng-ultra Für NanoXplore NG-Ultra-Unterstützung klonen Sie das [Project Beyond DB](https://github.com/yosyshq-GmbH/prjbeyond-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](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 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) oder `qt-base:x64-windows` (64-Bit) - Für Homebrew installieren Sie `qt6` und 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) oder `qt5-base:x64-windows` (64-Bit) - Für Homebrew installieren Sie `qt5` und 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-format` gemäß den Stilregeln in `.clang-format` formatiert (LLVM-basiert mit größeren Einzugsbreiten und geschweiften Klammern nach Klassen). - Um automatisch den gesamten Quellcode zu formatieren, führen Sie `make clangformat` aus. - 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.mp4` aus Tests ------- - Um auch Test-Binärdateien zu erstellen, verwenden Sie `-DBUILD_TESTS=ON` und führen Sie nach `make` `make test` aus, 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 -DCOVERAGE` und führen Sie nach `make` `make ice40-coverage` aus - Öffnen Sie anschließend `ice40-coverage/index.html` in Ihrem Browser, um den Coverage-Bericht anzuzeigen - Beachten Sie, dass `lcov` zum Generieren von Berichten erforderlich ist Links und Referenzen -------------------- ### Synthese, Simulation und Logikoptimierung - [Yosys](https://yosyshq.net/yosys/) - [Icarus Verilog](http://iverilog.icarus.com/) - [ABC](https://people.eecs.berkeley.edu/~alanmi/abc/) ### FPGA-Bitstream-Dokumentations- (und Tool-) Projekte - [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) ### Andere Open-Source-FPGA-Platzierungs- und Routing-Projekte - [Arachne PNR](https://github.com/cseed/arachne-pnr) - [VPR/VTR](https://verilogtorouting.org/) - [SymbiFlow](https://github.com/SymbiFlow/symbiflow-arch-defs)