XLS(Accelerated HW Synthesis)は、高水準の機能記述から合成可能なVerilog/SystemVerilogを生成する、GoogleのオープンソースHLSツールチェーンです。Apache 2.0で公開され、同じ設計をホスト上では高速に実行し、ハードウェア向けには機能的に同一なブロックとして出力することを狙っています。ただし、公式READMEが明記するとおり、まだ実験段階であり、Googleが正式にサポートする製品ではありません。(README)

DSLXとIRの間でハードウェアを捉える

主な入力言語のDSLXは、Rustに似た構文を持つ、イミュータブルで式指向のデータフローDSLです。任意のビット幅、固定サイズの値、解析可能なコールグラフなど、回路を記述するための性質を最初から言語へ組み込んでいます。一般的なCPU向け言語の逐次実行を、そのまま回路へ移す発想ではありません。(DSLX Reference)

DSLXはXLS IRへ変換され、最適化を通ったあと、スケジューラが演算をパイプラインの各段へ割り当てます。IRはSSAの性質を持つデータフロー表現で、制御フローグラフではなく、ノード同士の依存関係で計算を表します。CPUでは命令が順番に進むのに対し、回路では複数の演算が並行して動く。その違いをIRの形にも反映した設計です。(IR Overview)

クイックスタートでは、DSLXのテスト、IRへの変換、IR最適化、Verilog生成という流れを個別のコマンドで確認できます。たとえばクロック周期やパイプライン段数、遅延モデルを与え、制約を守るように演算を配置するのがcodegenの役目です。単にソースコードをRTLへ置換するのではなく、どの演算を何サイクル目に置くかまでコンパイラへ任せられます。(Quick Start, Codegen Options)

関数だけでなく、状態を持つprocも扱う

組み合わせ回路やパイプライン化した関数に加え、XLSには proc があります。procは固定の状態を持ち、FIFOのようなチャネルで別のprocと通信する、逐次回路向けのモデルです。config で接続を決め、init で初期状態を置き、next に各アクティベーションの処理を書きます。データ依存だけでは表せないI/O順序はtokenで明示します。(What is a Proc?)

ここは便利さと注意点が隣り合う部分です。受信待ちや有限FIFOのバックプレッシャーはパイプラインを停止させ、構成によってはRTLでデッドロックを起こし得ます。状態更新に複数サイクルかかれば、毎サイクル処理を始めるフルスループットにも届きません。抽象化されていても、レイテンシ、スループット、チャネル容量といった回路設計の論点は残ります。

まずはColabかバイナリで境界を見る

XLSにはDSLXのテスト、IR変換、Verilog生成に加え、Yosysでの合成やOpenROADでの配置配線まで試せるColabが用意されています。x64 Linux向けにはリリースバイナリもあります。ソースビルドはBazelとUbuntu 22.04を中心に案内され、READMEでは初回のフルビルドに長い時間がかかると説明されています。(README)

既存のC++資産を入口にしたい場合は、実験的なXLS[cc]もあります。ポインタは全面的に未対応ではなく、参照先を静的に解析できる配列スライスなど、限定的な利用に対応しています。公式テストには、実行時の添字で配列内の位置を選ぶ例もあります。一方、nullptrやポインタへのポインタは未対応で、関数ポインタや仮想メソッドも使えません。任意のC++をそのまま効率のよい回路へ変える道具ではなく、対応範囲を個別に確認する必要があります。(XLS[cc] Overview, ポインタの公式テスト, XLS[cc] README)

最初に試すなら、小さな演算をDSLXで書き、IRの最適化前後と生成されたRTLを並べて見るのがよさそうです。XLSの面白さは「ハードウェアを隠す」ことより、データフロー、タイミング制約、生成結果を行き来できる余白にあります。同時にDSLXは後方互換性を保たず変更されることがあるため、継続利用ではコンパイラ更新の追従方法まで先に決めておきたいところです。

参考