
nextpnr ポータブル FPGA 配置配線ツール
nextpnr -- ポータブルFPGA配置配線ツール =============================================== nextpnrは、ベンダーに依存しないタイミング駆動型のFOSS 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) にあります。 以下はiCE40用のnextpnrのスクリーンショットです。ビルド手順と[はじめに](#getting-started)は以下にあります。 <img src="https://assets.kitploit.com/production/public/readmes/10385/12bab50b683472060ad2a49530d9b6fe58b2c2b70efd1144b849ff83a8a6e80b.png" width="640"/> 関連リンク: - [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) Prerequisites ------------- 選択したアーキテクチャに関係なく、nextpnrをビルドするには以下のパッケージが必要です: - CMake 3.25以降 - モダンなC++17コンパイラ(開発には `clang-format` が必要) - Python 3.5以降(開発ライブラリを含む、Ubuntuでは `python3-dev`) - `nextpnr-himbaechel` にはPython 3.9以降が必要 - Windowsでは、[vcpkg](https://github.com/Microsoft/vcpkg/blob/master/ports/python3/CONTROL) でサポートされているバージョンと同じものをインストールしてください - Boostライブラリ(Ubuntuでは `libboost-dev libboost-filesystem-dev libboost-thread-dev libboost-program-options-dev libboost-iostreams-dev libboost-dev` または `libboost-all-dev`) - Eigen3(Ubuntuでは `libeigen3-dev`) - デモデザインの合成には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` に変更します。 - vcpkgのバージョン(現在Python 3.6.4)に一致するPythonのコピー。[Embeddable Zip File](https://www.python.org/downloads/release/python-364/) をダウンロードして展開します。埋め込み可能なzipファイル内の `python36.zip` を "Lib" という新しいディレクトリに展開する必要があるかもしれません。 - macOSでビルドするには、brewユーティリティが必要です。 - 必要なパッケージをすべてインストールします: `brew install cmake python boost eigen` Getting started --------------- まず最初に、以下を実行します: ``` git submodule update --init --recursive ``` ### nextpnr-ice40 iCE40をサポートするには、[Project IceStorm](https://github.com/YosysHQ/icestorm) を `/usr/local` または別の場所にインストールし、そのパスを `-DICESTORM_INSTALL_PREFIX=/usr` としてCMakeに渡します。その後、以下のコマンドで `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 ``` 静的リリースをビルドするには、ターゲットトリプレットを `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にアップロード ``` GUIモードでnextpnrを実行する(GUIサポート付きでnextpnrをビルドする手順は以下を参照): ``` 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` または別の場所にインストールし、そのパスを `-DTRELLIS_INSTALL_PREFIX=/usr/local` としてCMakeに渡します。その後、以下のコマンドで `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` または別の場所にインストールし、そのパスを `-DOXIDE_INSTALL_PREFIX=$HOME/.cargo` としてCMakeに渡します。その後、以下のコマンドで `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` または別の場所にクローンし、そのパスを `-DMISTRAL_ROOT=$HOME/mistral` としてCMakeに渡します。その後、以下のコマンドで `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) にあります。[Generic Architecture docs](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 ``` *バイナリビットストリームの作成には、NanoXploreのImpulseツールが必要です。* #### 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 GUIは、標準のヘッドレスビルドの依存関係を減らすためにデフォルトではビルドされません。有効にするには、CMakeコマンドラインに `-DBUILD_GUI=ON` を追加し、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` ` - この変更は次のターミナルセッションで有効になるため、ビルド前にターミナルウィンドウを開き直してください。 ### 複数アーキテクチャ 複数のアーキテクチャを同時にビルドするには、`-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-himbachel` 実行可能ファイルをビルドするには、`-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` の2つのバイナリがビルドされます。これらは一緒にインストールされますが、各マイクロアーキテクチャは互いに完全に独立しており、実行には対応する `.../share/himbaechel/<microarchitecture>/` チップデータベースディレクトリのみが必要です。分割ビルドにより、個々の配布物のサイズが削減され(総サイズは増加しますが)、異なるバージョンの配布物の同時インストールが可能になります。 Cross-compilation ----------------- チップデータベースとは別に、nextpnrはビルドシステム用にコンパイルされた `bba` ツールを必要とします。このツールは別のプロジェクトとしてコンパイルできます: ``` cd bba cmake . make ``` これにより、`bba-export.cmake` ファイルが作成されます。クロスビルド時に `-DBBA_IMPORT=/path/to/bba-export.cmake` を使用して、このファイルへのパスをnextpnrに指定します。 Additional notes for building nextpnr ------------------------------------- 以下は、GUIなし、Pythonサポートなし、HeAPアナリティックプレーサなし、HX1KのみのサポートでiCE40アーキテクチャのデバッグビルドを実行します: ``` 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` を使用します。 Notes for developers -------------------- - すべてのコードは `.clang-format` のスタイルルールに従って `clang-format` でフォーマットされています(LLVMベースで、インデント幅が拡大され、クラス後に中括弧が折り返されます)。 - すべてのソースコードを自動的にフォーマットするには、`make clangformat` を実行します。 - アーキテクチャAPIの追加ドキュメントについては、wikiを参照してください。 Recording a movie ----------------- - 配置配線のムービー録画を保存するには、ツールバーの録画アイコンをクリックし、録画ファイルを保存する空のディレクトリとスキップするフレーム数を選択します。 - 必要なPnR操作を手動で開始します - 録画アイコンをもう一度クリックして録画を停止します - ファイルが含まれているディレクトリに移動し、`ffmpeg -f image2 -r 1 -i movie_%05d.png -c:v libx264 nextpnr.mp4` を実行します Testing ------- - テストバイナリもビルドするには、`-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` が必要です Links and references -------------------- ### 合成、シミュレーション、論理最適化 - [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) ### その他のFOSS FPGA配置配線プロジェクト - [Arachne PNR](https://github.com/cseed/arachne-pnr) - [VPR/VTR](https://verilogtorouting.org/) - [SymbiFlow](https://github.com/SymbiFlow/symbiflow-arch-defs)