HN 日本語サマリー

← 一覧へ戻る
プログラミング

XLS: 高速化されたハードウェア合成

XLS: Accelerated HW Synthesis (google.github.io)

9 pointsby Bluestein3 コメント

要約

XLS(Accelerated HW Synthesis)は、Googleが開発した高位合成(HLS)ツールチェーンです。ソフトウェアエンジニアがハードウェアIPを迅速に開発できるよう支援し、ハードウェア記述言語(Verilog/SystemVerilog)を生成します。このプロジェクトは実験段階にあり、Apache 2ライセンスで提供されています。

全文翻訳

XLS: 高速化されたハードウェア合成

[画像: XLS Logo]

XLSとは?

XLSは、柔軟な高レベル記述から合成可能な設計(VerilogおよびSystemVerilog)を生成するハイレベル合成(HLS)ツールチェーンを実装しています。Apache 2ライセンスで提供されています。

XLS(Accelerated HW Synthesis)は、「ムーアの法則の終焉(EoML)」時代のソフトウェア開発キット(SDK)となることを目指しています。この「専門化の時代」において、ソフトウェアエンジニアとハードウェアエンジニアは、ドメインの境界を越えてより多くの協調設計を行い、共有成果物を共同で開発し、互いのコストモデルを理解し、ツール/方法論を共有する必要があります。XLSは、自動化、ソフトウェアエンジニア、およびマシンサイクルを活用して、この全体的なプロセスを加速しようと試みています。

XLSは、ハードウェアIPの迅速な開発を可能にし、それは「ソフトウェアスタイル」の方法論を通じて効率的なホストソフトウェアとしても実行できます。XLS設計は、ホストソフトウェアやシミュレータでの使用のためにネイティブ速度で実行されますが、その設計はハードウェアブロック出力も生成できます。XLSツールの正確性は、それらが機能的に同一であることを保証し(そして形式的に検証するためのツールを提供します)。

XLSは、純粋なワイヤI/Oインターフェースを持つ(オプションでパイプライン化された)関数と、並行プロセス(またはproc)の両方をサポートします。Procはステートフルであり、時間の経過に伴う帰納を可能にし、より一般的な通信インターフェースを含みます。

プロジェクトの現状

XLSは実験的なものであり、急速な開発が進められており、Googleの公式サポート製品ではありません。バグや未熟な点がある可能性があります。ぜひ試してみて、チュートリアルを試したり、バグを報告したりして、ご協力ください。

私たちは初期段階にあり、これはいくつかの実用的な影響があります。

  • 問題報告やプルリクエストを歓迎します。まず問題報告から始めてください。変更をアップストリームしたい場合は、私たちと対話してください。問題報告なしにプルリクエストを送信すると、成功への道のりが長くなる可能性があります。プルリクエストが準備完了であり、2営業日以内に応答がないと思われる場合は、次のステップだと思うことを問題報告で ping してください。
  • 現在の進化段階では、後方互換性を考慮せずにDSLXを定期的に改善しています。XLSでハードウェアのコーパスを構築している場合は、コンパイラの新しいバージョンを取り込むプロセスについて慎重に検討してください。

Colab Notebooks

XLSをよりセットアップ不要で環境に依存しない方法で試すには、Colab Notebookをご覧ください。

  • bit.ly/learn-xls: Rustにインスパイアされたドメイン固有言語(DSL)であるDSLXの「Y分でXLSを学ぶ」スタイルのウォークスルー。

  • bit.ly/xls-playground: 以下のインタラクティブな実行が可能なXLS評価環境。

    • XLSテスト
    • XLS→IR変換
    • IR→Verilogコード生成
    • YosysによるVerilog合成(open PDKs ASAP7およびSKY130を使用)
    • OpenROADによる配置配線(P&R)
    • 電力/性能/面積(PPA)メトリック収集

最新リリースをインストール

以下のコマンドは、x64 Linuxマシン用の最新のGitHubリポジトリリリースバイナリをダウンロードします。

# 最新リリースtarballのURLを決定します。
LATEST_XLS_RELEASE_TARBALL_URL=$(curl -s -L \
  -H "Accept: application/vnd.github+json" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/google/xls/releases | \
  grep -m 1 -o 'https://.*/releases/download/.*\.tar\.gz')

# tarballをダウンロードして展開し、含まれる各ツールのバージョン番号を確認します。
curl -O -L ${LATEST_XLS_RELEASE_TARBALL_URL}
tar -xzvvf xls-*.tar.gz
cd xls-*/
./interpreter_main --version
./ir_converter_main --version
./opt_main --version
./codegen_main --version
./proto_to_dslx_main --version

ソースからビルド

バイナリリリース(上記の説明の通りx64 Linux用が利用可能)および利用可能なColab Notebookに加えて、XLSはBazelビルドシステムを使用してソースからビルドする必要があります。

以下の手順は、Ubuntu 22.04(Jammy Jellyfish)Linuxディストリビューション用です。

平均的な8コアVMで:

  • C++フロントエンドなしの完全な初期ビルド(例:「DSLXのみ」)は約2時間かかる場合があります。
  • C++フロントエンドを含む場合は最大6時間かかる場合があります。

以下の2つの対応するコマンドラインを参照してください。まず、Bazelがインストールされていることを前提とします。

~$ git clone https://github.com/google/xls.git
~$ cd xls

~/xls$ # bazelのインストール手順に従ってbazel 7をインストールします。
~/xls$ # https://bazel.build/install/ubuntu

~/xls$ # ここでUbuntuに `/usr/bin/env python` が実際にはpython3であることを伝えます。
~/xls$ # 過去のUbuntuではデフォルトでそうではありませんでした。
~/xls$ # これは重要です。この手順なしでは、不可解なエラーメッセージが発生する可能性があります。
~/xls$ sudo apt install python3-dev libtinfo6 python-is-python3

~/xls$ # 最適化ビルドモードでビルド/テストします。
~/xls$ # C++フロントエンドを使用しない場合(厳密には必要ありません。つまりDSLXフロントエンドのみ)、このコマンドラインを使用します。
~/xls$ bazel test -c opt -- //xls/... -//xls/contrib/xlscc/...

~/xls$ # すべてをビルドするには、C++フロントエンドを含めて実行します。
~/xls$ bazel test -c opt -- //xls/...
Dockerビルド

上記(依存関係の限定されたセット)のセットアップに環境で問題がある場合は、Dockerfileを介して参照ビルド/テスト環境設定が提供されています。

~$ git clone https://github.com/google/xls.git
~$ cd xls
~/xls$ # xlsテストをビルドして実行します。
~/xls$ docker build . -f Dockerfile-ubuntu-22.04
~/xls$ # xlsビルド環境をセットアップし、手動テスト/ビルドを可能にします。
~/xls$ docker build . -f Dockerfile-ubuntu-22.04 \
                      -t xls-build-docker \
                      --build-arg SKIP_TESTS=1
...
~/xls$ docker run -it --rm xls-build-docker /bin/bash
...
xls-developer@de12154edf52:~/xls$ bazel build --verbose_failures -c opt //xls/jit:jit_channel_queue_test
...
追加ビルドキャッシュの追加

多くのプログラマーはccacheのようなプログラムを使用してビルドのキャッシュを改善することに慣れていますが、Bazel自体は非常に高品質なキャッシュレイヤーを備えています。特に、増分ビルドはより安全です。

ただし、Bazelがローカルでキャッシュされた結果を使用できたはずのファイルを再コンパイルしたり、bazel cleanの後でも特定の途中結果を再利用するのが安全な場合があるという判断を下す状況があります。これを改善するには、永続的にディスク上の別の場所にファイルを保存する共有「ディスクキャッシュ」を使用するようにBazelに指示できます。どこかにディレクトリを作成し(例:~/.bazel_disk_cache/)、次を実行します。

echo "build --disk_cache=$(realpath ~/.bazel_disk_cache)" >> ~/.bazelrc
echo "test --disk_cache=$(realpath ~/.bazel_disk_cache)" >> ~/.bazelrc

警告

Bazelはこのディレクトリのガベージコレクションを自動化しないため、時間とともに無制限に増加します。手動または自動スクリプトで定期的にクリーンアップする必要があります。

あるいは、ガベージコレクションを処理してくれるリモートキャッシュを追加することもできます。これは個人サーバーまたはローカルマシンでホストできます。私たちは個人的にbazel-remoteのローカルホストインスタンスで良好な結果を得ています。

Clangd補完の取得

Clangd補完および関連機能を取得するには、2つの方法があります。

Clangdおよび類似ツールと互換性のあるcompile_flags.txtファイルは、xls/dev_tools/make-compilation-db.shを実行して作成できます。このアプローチは高速ですが、個々のターゲットがビルドされる方法の違いを考慮しません。

あるいは、Clangdが消費できるcompile_commands.jsonファイルを生成するためにhedronvision/bazel-compile-commands-extractorを使用できます。このアプローチはセットアップに時間がかかりますが、コンパイラフラグはターゲットごとに調整されます。compile_commands.jsonファイルは次を実行してビルドできます。

bazel build -c opt //xls/... -k
bazel run //:refresh_compile_commands

詳細については、トップレベルのBUILDファイルのコメントを参照してください。

スタック図とプロジェクトレイアウト

新しいコードベースのナビゲーションは daunting になる可能性があります。以下の説明は、重要なディレクトリとその意図された組織/目的のハイレベルなビューを提供し、このXLSスタック図のコンポーネントに対応します。

[画像: XLS Stack Diagram]

  • dependency_support: XLSの外部依存関係のBazelターゲットをロード、ビルド、公開するための設定ファイル。
  • docs_src: Markdownファイルソース。Markdownはmkdocsを介してdocsにレンダリングされます。
  • xls: 一般的なBazelプロジェクトスタイルに倣った、リポジトリ内のプロジェクト名サブディレクトリ。
    • build: XLS成果物を作成するビルドマクロ。例:DSLXからIRへの変換、DSLXコードのテストターゲットの作成など。
    • codegen: Verilog/SystemVerilog操作およびFSMを生成するためのVerilog AST(VAST)サポート。VASTは、XLS IRからの変換におけるジェネレーター(例:PipelineGenerator、FSM用のSequentialGenerator)と呼ばれるコンポーネントによって構築されます。
    • common: 標準ライブラリの使用の上にレイヤー化された「ベース」機能。一般的に、可能な限りAbseil Abseilバージョンのベース構造を使用します。
    • contrib/xlscc: XLS IRをターゲットとする実験的なC++構文サポート(DSLXの代替パス)。Googleの姉妹チームによって開発され、XLSプロジェクトの残りの部分と同じオープンソース/テストフローを共有しています。既存のC++ HLSコードベースを持つチームにとって特に興味深いかもしれません。
    • data_structures: XLSで使用される汎用データ構造で、標準ライブラリを拡張します。例:BDD、Union-Find、最小カットなど。
    • delay_model: ターゲットバックエンドプロセス上のXLS IR操作のデータ遅延を特徴付け、記述し、補間する機能。すでに特徴付けられた記述はxls/estimators/delay_model/modelsに配置され、コマンドラインフラグを介して参照できます。
    • dslx: Rustに似たDSL(「DSLX」と呼ばれる)ですが、ハードウェア指向の機能(例:任意のビット幅、完全に固定サイズのオブジェクト、完全に分析可能なコールグラフ)を持つ、不変な式言語データフローDSLです。XLSチームは、フォン・ノイマン様式の計算を想定して設計された言語と比較して、データフローDSLがハードウェアを記述するのに適していることを見出しました。
    • fuzzer: DSLレベルでプログラムを生成し、異なる実行エンジン(DSLインタプリタ、IRインタプリタ、IR JIT、コード生成されたVerilogシミュレータ)をクロス比較する、フルスタックのマルチプロセスファザーです。クラスタの異なるノードで同時に簡単に実行し、共有された発見を蓄積できるように設計されています。
    • examples: XLSスタックを通じてテストおよび実行可能な計算例。
    • experimental: 実験的な探索からキャプチャされた成果物。
    • interpreter: XLS IRのインタプリタ。デバッグと探索に役立ちます。スループットが必要な場合は、JIT(下記)を検討してください。
    • ir: XLS IRの定義、テキストパーサー/フォーマッター、および抽象評価のための機能。
    • jit: XLS IRのLLVMベースJIT。DSLXおよびXLS IRプログラムのネイティブ速度実行を可能にします。
    • modules: ハードウェアビルディングブロックDSLX「ライブラリ」(DSLX標準ライブラリ外)。広範な設計で簡単に再利用またはインスタンス化できます。
    • netlist: 関連するセルライブラリを持つ単純な構造的Verilogで一般的に提供されるネットリストレベルの記述を解析/分析/解釈するライブラリ。
    • passes: 最適化の一部としてXLS IRで実行されるパス。スケジューリング/コード生成の前に行われます。
    • scheduling: スケジューリングアルゴリズム。クロック設計で操作がいつ実行されるか(例:どのパイプラインステージか)を決定します。
    • simulation: Verilogシミュレータをラップし、XLS計算用のVerilogテストベンチを生成するコード。現在、非合成テストベンチ構造をサポートしているため、iverilogがシミュレーションに使用されています。
    • solvers: XLS IRをSMTソルバー入力に変換し、XLS計算上で形式証明を実行できるようにします。例:XLS IRとネットリスト記述間の論理等価性チェック。Z3がソルバーエンジンとして使用されます。
    • synthesis: バックエンド合成フローをラップするインターフェース。これにより、ツールを例えばASICとFPGAフロー間でリターゲットできます。
    • tests: XLSプロジェクトのさまざまなトップレベルコンポーネントにまたがる統合テスト。
    • tools: コマンドラインインターフェースを介して、XLSシステムとそのライブラリを分解して機能する多くのツール。
    • visualization: XLSコンパイラ/システムをインタラクティブに検査するための可視化ツール。IR可視化を参照してください。

XLSに関するディスカッション - 開発、デバッグ、使用法など:

  • 理想的にはXLSリポジトリのGitHubディスカッションで行われます。
  • ただし、ディスカッションの場としてメールの方が適していると感じる場合は、xls-devメーリングリストもあります。検索可能で簡単に相互参照でき、問題トラッカーの問題に変換できるため、可能な限りGitHubディスカッションを優先してください。

コントリビューター

以下はXLSプロジェクトのコントリビューターです。貢献に興味がある場合は、貢献に関するドキュメントおよび良い最初の問題を参照するか、GitHubディスカッションでご連絡ください!