
nextpnr nextpnr-0.11
nextpnr ポータブル FPGA 配置配線ツール
nextpnr -- ポータブルFPGA配置配線ツール
nextpnrは、ベンダーに依存しないタイミング駆動型のFOSS FPGA配置配線ツールを目指しています。
現在、nextpnrは以下をサポートしています:
- Lattice iCE40デバイス(Project IceStorm によるサポート)
- Lattice ECP5デバイス(Project Trellis によるサポート)
- Lattice Nexusデバイス(Project Oxide によるサポート)
- Gowin LittleBeeおよびAurora Vデバイス(Project Apicula によるサポート)
- NanoXplore NG-Ultraデバイス(Project Beyond によるサポート)
- Cologne Chip GateMateデバイス(Project Peppercorn によるサポート)
- (実験的) Cyclone Vデバイス(Mistral によるサポート)
- (実験的) Lattice MachXO2デバイス(Project Trellis によるサポート)
- (実験的) Xilinx 7シリーズデバイス(Project X-Ray によるサポート)
- (実験的) ユーザー定義アーキテクチャ用の「汎用」バックエンド
Yosys+nextpnrフローを説明する簡単な(学術)論文は arXiv にあります。
以下はiCE40用のnextpnrのスクリーンショットです。ビルド手順とはじめには以下にあります。
関連リンク:
Prerequisites
選択したアーキテクチャに関係なく、nextpnrをビルドするには以下のパッケージが必要です:
- CMake 3.25以降
- モダンなC++17コンパイラ(開発には
clang-formatが必要) - Python 3.5以降(開発ライブラリを含む、Ubuntuでは
python3-dev)nextpnr-himbaechelにはPython 3.9以降が必要- Windowsでは、vcpkg でサポートされているバージョンと同じものをインストールしてください
- 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 をダウンロードして展開します。埋め込み可能なzipファイル内の
python36.zipを "Lib" という新しいディレクトリに展開する必要があるかもしれません。
- 32ビットビルドの場合:
- macOSでビルドするには、brewユーティリティが必要です。
- 必要なパッケージをすべてインストールします:
brew install cmake python boost eigen
- 必要なパッケージをすべてインストールします:
Getting started
まず最初に、以下を実行します:
git submodule update --init --recursive
nextpnr-ice40
iCE40をサポートするには、Project 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 を /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 にあります。
nextpnr-nexus
Nexusをサポートするには、Project Oxide を $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 にあります。
nextpnr-mistral
Cyclone Vをサポートするには、Mistral を $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 にあります。Generic Architecture docsも参照してください。
nextpnr-himbaechel
himbaechelターゲットを使用すると、共通構造を共有する大規模アーキテクチャの配置配線を実行できます。
gowin
Gowinをサポートするには、Project Apicula をインストールします
mkdir -p build && cd build
cmake .. -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin"
make -j$(nproc)
sudo make install
- さまざまなボード向けのGowinフローの例は、Project Apicula Examples にあります。
ng-ultra
NanoXplore NG-Ultraをサポートするには、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
バイナリビットストリームの作成には、NanoXploreのImpulseツールが必要です。
gatemate
Cologne Chip GateMateをサポートするには、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
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
合成、シミュレーション、論理最適化
FPGAビットストリームドキュメント(およびツール)プロジェクト
- Project IceStorm (Lattice iCE40)
- Project Trellis (Lattice ECP5)
- Project X-Ray (Xilinx 7-Series)
- Project Chibi (Intel MAX-V)