LLHDはLLVMを拡張したハードウェアを記述するための中間言語である。CIRCTの実装を読むにあたりこの論文にいくつか言及されていたので読んでみることにした。
ハードウェア設計のフロー全体で使用できる新しいIRとしてLLHDを提案する。LLHDはこれまでのEDAツールで統一されていなかった中間表現を統一することができ、既存のHDLを完全に包含することができる。
1. Introduction
現在のデジタル回路設計で使用されているワークフローは非常に複雑で、シリコンを完成させるまでに非常に多くのツールを必要としている。これらのツール間を渡るための表現がHDLであるが、このHDLの仕様も非常に複雑で、かつ詳細な動作もEDAベンダのツールに依存していることが多い。このため設計者はHDLの中で安全に動作することが保証されている「安全なサブセット」に依存することになってしまう。
LLHDはデジタル回路設計における設計フロー全体をカバーするために作成されている中間表現(Intermediate Representation)である。「シミュレーション」「テストベンチ」「フォーマル検証」「動作モデリング」「構造モデリング」「合成」「最終的なゲートレベルネットリスト」をカバーするために開発されている。
LLHDは3段階のレベル(方言:Dialect)をもっており、ツールに応じてそれぞれ使い分ける。
デジタル回路用のIRは、時間的な経過情報を明示的に扱う必要があるのと、同時実行を記述できる必要がある。
- 現在のHDLを、最新の命令型コンパイラと互換性のあるSSAベースの形式でキャプチャし、デジタルハードウェアを表現するために重要な拡張や特殊化を行うマルチレベルのIRを定義する(§2)。
- SystemVerilogやVHDLのような既存の業界標準のHDLがこのIRにどのようにマッピングされるかを示します(§3)。- さらに、Behavioural LLHDからハードウェアに近いStructural LLHDへの変換パスを確立する(§4)。
- このようなマルチレベルのIRは、商用ツールによる明示的なサポートがなくても、既存のEDAツールフローを改善できることを示す(§5)。
- また、IRがCPUコア全体のような複雑な設計を取り込むことができること[31]、最小限のリファレンス・シミュレータがこれらの設計を商用シミュレータと同じようにモデル化することができること、初期に最適化されたシミュレータが商用シミュレータよりも最大2.4倍高速に動作することを示す(§6)。
この実装はオープンソースとして公開している。
2. The LLHD Intermediate Representation
2.1 デジタル回路の記述
ハードウェアの記述には、時間の経過の概念が必要であり、同時実行を表現できなければならず、また、回路の構造と階層を記述する方法を提供しなければなりません。これは、デジタル回路が本質的に階層的であり、同時実行であり、時間に依存しているためです。LLHDは、過去数十年にわたってHDLで確立されてきた抽象的な概念を、基本的な直交する概念に集約したものである。図2は、アキュムレータ回路のテストベンチを記述したLLHDのソース・テキストの一例である。この言語は3つのモデリングコンストラクトを提供します。 Functionは、入力値のセットから出力へのマッピングをキャプチャし、計算の再利用を可能にします。関数は、コードの再利用、再帰、入力値のセットから単数の出力値へのプログラムによるマッピングをSSAグラフ上で容易に行うことができますが、ハードウェアで直接対応できるものではありません。(図2a参照)
Processは、回路の状態と出力が入力の変化にどのように反応するかを記述するチューリング完全なサブプログラムである。これにより、行動的な回路の記述が可能となる。(図2b参照)
Entitiesは、他のプロセスやエンティティをインスタンス化することで階層を構築し、それらが同時に動作します。これは構造的な回路記述となります。このようなインスタンス化は、物理的なシリコンでの複製による再利用につながり、何十億ものトランジスタを持つデザインを製造する能力に不可欠な要素となっています。(図2c参照)
HDLで記述された回路設計は、一般的に回路を動作的、構造的にモデル化する。物理的なシリコン自体は、純粋に構造的に配置された回路であるため、エンティティの階層によって完全に把握されます。関数やプロセスは、HDLを完全に表現するための単なるモデリングツールであり、物理的には同等の機能を持たないシミュレーションや検証のコンポーネントを含みます。これらの抽象度を把握するために、LLHDは次のような3階層のIRとなっている。
2.2 複数レベルのIntermediate Representation
LLHDは、SystemVerilogやVHDLなどの上位HDLで記述されたデジタルデザインを、シミュレーション、検証、テストなどのあらゆる面から捉えることができます。LLHDは、SystemVerilogやVHDLなどの上位HDLで記述されたデジタルデザインを、シミュレーション、検証、テストなどを含めてすべて取り込むことができる。これにより、LLHDは以下のレベルを持つマルチレベルのIRとなっている。
Behavioral LLHD : LLHDの目的は、上位のHDLで記述された回路をできるだけ簡単にキャプチャすることである。LLHDでは、シミュレーションコンストラクトやテストベンチを完全に表現することができ、アサーション、ファイルI/O、フォーマル検証情報などをイントリンシックとして含めることができます。
Structural LLHDでは、デザインの入力と出力の関係を記述する部分に限定している。これはエンティティで表現できるものを基本的にすべてカバーしている(より技術的な説明は§4を参照)。
Netlist LLHDでは、エンティティと、サブサーキットをインスタンス化して接続するための命令のみに記述を限定しています。具体的には、エンティティの構築、信号の生成(sig)、接続(con)、遅延(del)、サブサーキットのインスタンス化(inst)などが許可されています。
Netlist LLHDの構成要素はStructural LLHDの厳密なサブセットであり、Structural LLHDはBehavioural LLHDの厳密なサブセットであることがわかっています。そこで、3つの別々のIRを定義するのではなく、プロセス全体をカバーする1つの全体的なIRを提案します。デザインがハードウェア設計フローを通過する際、シミュレーションとデザイン検証のフェーズでは、Behavioural LLHDのフルIRを使用します。合成の前に、LLHDコンパイラはデザインをStructural LLHDに落とします。シンセサイザーは、論理合成を行い、デザインをターゲットとなるシリコン・テクノロジーにマッピングすることで、デザインをネットリストに落とし込みます。
このセクションでは、LLHDのコンストラクトをより詳しく説明します。以下の2つのセクションでは、まずHDLからLLHDへのデザインのマッピングについて説明し(§3)、次に異なるLLHDレベル間でデザインを変換するためのコンパイラパスについて説明する(§4)。
2.4 Units
LLHDは以下の3つをユニットと呼び、基本的な構成単位となる。
- 関数 :
func
で定義され、他のユニットからcall
命令で呼び出される。関数は即時実行され、シーケンシャルに評価される。 - プロセス : 0個以上の入力と出力を持つ回路として表記される。入力と出力は信号型でなければならない。
- エンティティ : DFGを示し、データフローを構築する。
2.5 命令セット
LLHDのシンプルな命令セットは、ハードウェア記述の本質を、ハードウェアに近い抽象度で捉えています。しかし、LLHDでは、市販のハードウェアシンセサイザーで最適化の対象となっている算術演算を保持しています。原則として、すべての命令には、各オペランドと結果の型を決定するのに十分な型注釈が含まれています。ここでは、すべての命令、特にLLVMなどの命令型コンパイラのIRでよく見られる命令の詳細な説明を省略し、ハードウェア固有の概念に焦点を当てています。
- 階層構造は
inst
で記述する。 - 信号は
sig
命令で生成する。 - レジスタは
reg
命令で生成し、クロックに応じて何を入力するのかを決定する。 - データフローは変数間の演算を使って記述する。
- ポインタ・信号などの演算をサポートする。
- 制御フローは
call
、ret
など、br
、wait
なども使用することができる。 - メモリを定義してアクセスすることができる。