| |
高位合成
はじめに
コンセプトをシリコンとして具体化する設計手法の進化は止まりません。80年代末から導入が始まったRTL設計手法は、それまで主流だった回路図入力ベースのゲートレベル設計手法を置き換え、この4半世紀で広く普及しました。「ハードウェア設計=VerilogでハードウェアをRTL記述すること」という認識があるほど、重要な役割を果たしてきました。われわれは先進ユーザで運用が始まった高位合成を活用した設計手法が次の4半世紀で重要な役割を果たすことを確信しています。
高位合成とは?
高位合成(HLS: High Level Synthesis)とは、RTレベルより上位のある抽象レベルの記述を入力として、その記述をハードウェアとして変換(合成)する技術を言います。一口に「高位合成」といっても、技術的内容は多岐に渡ります。ここでは市場で導入が進んでいる動作合成ツールが扱う、RTレベルよりも抽象度が高くクロックサイクルを意識しないビヘイビア記述を主な入力とし、論理合成可能なRTL記述に変換する技術の概要について説明します。本説明では「高位合成」と「動作合成(Behavior Synthesis)」を同じ意味として扱うことにします。
論理合成との違いは?
- RTL設計とゲートレベル設計
RTL設計とゲートレベル設計を比べてみましょう。ゲートレベル設計では、機能とタイミングを同時に考えてセルを割り付けていきます。一方、RTL設計では、各機能をどのサイクルで実行するかを考えます。各機能の詳細なタイミング設計、つまりゲートレベルライブラリセルへのマッピングは、論理合成ツールによってその多くの作業が自動化されています。こうしてRTL設計では機能設計を詳細タイミング設計から分離できるため、ゲートレベル設計に対して効率的な設計が可能になりました。
商用の論理合成ツールが登場した80年代後半では、RTL設計は特別な設計手法でした。それから4半世紀が経った今日、RTL設計はポピュラーなハードウェア設計手法として定着し利用されています。
- ビヘイビア設計とRTL設計
高位合成を単純化すると、ビヘイビアレベルの記述を解析し単位機能の集まりに変換する。そして各機能にサイクルを割り付ける処理と考えることができます。各機能のサイクルへの割付は、スケジュール処理により自動化されています。スケジュール結果に基づき、データパスを構成し、データパスを制御するFSMを自動的に合成します。こうして、自動化されたスケジュール処理により、機能設計をサイクルレベルの詳細タイミング設計から分離できます。その結果、記述の抽象度を高めることが可能になり、効率的な設計が可能になります。
- RTL設計、ビヘイビア設計比較表

メリットは?
- 典型的なメリット
スケジュール処理により、機能設計と詳細なサイクルレベルのタイミング設計を分離できるため、記述の抽象度を上げられます。その結果、記述量の削減による設計工数の削減、自動変換による機能バグの削減、煩雑で誤りがちなFSM設計の自動化、イベント量の減少によるシミュレーションの高速化、ビヘイビア記述のため再利用が容易、…などさまざまなメリットがあります。また、ビヘイビア設計からRTLフローへの実現パスの自動化により、Cベースのモデルを出発点としたRTL設計の効率化が可能なことは明らかです。
- 生産性の改善
上記の典型的なメリットにより、RTL設計手法と比べて設計および検証工数を削減できます。ビヘイビア設計適用によって、一般に3倍以上の生産性改善を達成できることが多いです。こうしたメリットの多くは、RTL設計導入のメリットと多くの類似点を持っていることにお気づきのことと思います。


- 歴史は繰り返す
「RTL設計+ 論理合成」の導入開始から、もう4半世紀が経とうとしています。まさに、歴史は繰り返すということですね。
デメリットは?
- 新しい言語の学習
多くの高位合成ツールではC/C++、SystemCなどの標準言語または、ベンダが拡張したC言語などツール固有な言語を入力言語として使用します。みなさんが慣れ親しんでいるVerilogとは異なりますが、80年代後半にVerilog HDL導入の旗振りをしたときにも同じことを言われたものです。
- 高位合成ツールの成熟度
ツールにより凸凹はありますが、近年の導入実績を考えると、実用に耐えるレベルといえると思います。
高位合成サブセット
高位合成ツールはSystemC/C++ の動作合成向けサブセットをサポートしています。主な高位合成ツールであれば、多くのC++構文がサポートされています。たとえば:
| データ型: |
bool, char, short, int, long, float(*),double(*),enum,array |
| 演算子 : |
算術、関係、論理、ビット、シフト、代入、オーバーロードなど |
| ループ文: |
for, while, do-while |
| 条件文 : |
if, switch, ?:, break, continue |
| 関数 : |
関数、inline, 仮想関数(*)、関数オーバーロード、 |
| |
テンプレート、ポインタ(*)、参照など |
| 構造体 : |
struct, class, 継承、コンストラクタ(*)、テンプレートなど |
| ‘(*)’: |
合成サブセットの制限あり |
具体的なサブセットの内容は、現時点では各ツールによって若干ブレがありますが、その違いはそれほど大きくありません。OSCI Synthesis Working Group で議論されている、高位合成サブセット(SystemC Synthesizable Subset)が近々公開されると思います。各ツールがサポートするSystemC動作合成記述向けサブセットの具体的な内容については、各ベンダに問い合わせください。
設計階層の扱い
- 記述単位
SystemCでは、設計モジュールの単位として SC_MODULEを使用します。直感的にはVerilog HDLのmoduleとよく似ています。

高位合成ツールは、このSC_MODULEを単位として合成処理を実行します。デザインを分割するには、モジュールやスレッドを使いますが、各分割単位をどの程度の大きさにするかは、さまざまな設計上の要素と高位合成ツールの能力や制限を勘案して決めます。
SC_MODULEには、ポート、プロセス、データ、メソッドなどの宣言・定義に加えて、下位階層を記述することができます。
- 下位階層の記述
SystemCでは、SC_MODULEを設計単位として、階層設計をサポートします。親モジュールのコンストラクタで下位階層(サブモジュール)をインスタンス化し、サブモジュールの各ポートをsc_signalで接続します。
- プロセス
SC_MODULEには動作の単位となるプロセス(スレッド)を任意の個数記述できます。シミュレーションカーネルは各スレッドを並列実行単位として扱います。直感的には Verilogの alwaysブロックと似ています。SystemCは3種類のスレッドタイプ、SC_THREAD, SC_CTHREAD, SC_METHODを用意しています。が、ツールによりサポートが異なります。
タイミングの扱い
- アンタイムドとタイムド記述
アルゴリズムレベルの記述では、サイクルレベルのタイミング動作を記述することはまれです。一方、既存RTLモジュールと通信するインターフェイス部分では、通信プロトコルをモデル化するために、サイクルレベルのタイミング動作を記述できる必要があります。前者がアンタイムドな記述、後者がタイムドな記述の典型例にあたります。
- SC_CTHREADおよびSC_THREADとwait
SystemCのSC_CTHREAD/SC_THREADはクロックに同期したプロセスを記述することができる構文です。SC_CTHREAD/SC_THREADで wait(); と記述すると、スレッドはwait();までの一連のコードを実行し、次のクロックエッジまでスレッドを一時停止します。SC_THREADはClockをSensitivityに登録する必要があります。次のクロックエッジか来ると、wait(); に続くコードから実行を再開します。ハードウェアとして考えると、このwait()の挿入は、クロックエッジを挿入することと同じ意味を持ちます。たとえば、次のSystemC記述とverilog記述は等価です:
[SystemC]
…;
wait();
…
[Verilog]
…;
@(posedge clk);
…
- スケジュールとタイミング制約
高位合成ツールは、記述のタイミング制約を表現する手段を提供しています。アルゴリズムレベルの記述は、設計目標(仕様)に基づいたタイミング制約の指定に従って、自動的にスケジュールを行います。したがって、制約の範囲内でレイテンシが伸び縮みします。インターフェイス部部の記述は、すでにマニュアルでサイクル精度のスケジュールが行われた記述ですから、このスケジュールを保持しつつ各種最適化を行います。また、高位合成ツールによっては、インターフェイス部分を自動で合成する機能を実装しているものもあります。
設計制約の扱い
設計目標の制御は、論理合成ツールと同様に設計制約を指定することにより行います。動作周波数、レイテンシ、スループット、回路面積などの目標を制約できることが一般的です。なお、設計制約の種類や指定方法は高位合成ツールに依存しますので、具体的な内容については各ツールベンダに確認ください。
高位合成ツールの中身はどうなっているのか?
単純なアルゴリズム記述を例題として、高位合成ツールの処理フローを示します。
- フロントエンド最適化
ビヘイビア記述レベルで各種変換、最適化を行い、内部データ構造を構築します。
例:定数伝播最適化、データサイズ最適化、ループ変換、他

内部データ構造は、通常グラフ構造などを利用して表現されます。たとえば、グラフのエッジでコントロール/データの依存関係(例:’+ c’を実行するにはもうひとつのオペランド a * b の結果が必要)を表し、グラフのノードで各機能の種類(例:+, *)、オペランドのサイズ(例:8ビット)など各種属性情報を表現します。
- スケジュール
内部データ構造として表現された各動作にリソース(演算器、レジスタなど)を割付け、クロックサイクルを割り当てます(これが初期スケジュール結果)。

高位合成ツールがターゲットテクノロジの特性を生かした合成処理を行うためには、スケジュールの基準となるリソース(演算器、レジスタなど)の品質は重要です。多くの高位合成ツールはあらかじめまたは合成処理の実行時に、テクノロジライブラリからリソースを自動生成し、そのタイミングや面積の情報に基づいてスケジュールや各種最適化処理を実行します。たとえば、上記はあらかじめリソースを生成するアプローチを想定した例です。

初期スケジュールは機能的には正しいですが、レイテンシやリソース数など、必ずしも最適な結果ではありません。たとえば、Cycle1で2つの乗算を実行しています。次のように乗算を別々のサイクルにスケジュールすることができれば、同時に必要な乗算器は1つで済みます。
設計制約を満たしつつ、リソース数の最小化やレイテンシの削減など、スケジュールを最適化します。

- アロケーション&バインディング
リソースに具体的なインスタンスを割り当てます。

異なるクロックサイクル(ステート)に割り当てられたリソースは、別のステートで再利用可能です。また、あるオペランド幅のリソースで、それで包含できるリソースを実現することができます。たとえば、8* 8の乗算は、20 * 20の乗算で包含できます。こうして演算器やレジスタの共有化を行います。
- RTLアセンブリ
最適化されたデザインを、データパス、メモリ、FSMで構成されたRTLとして、論理合成可能なスタイルで出力します。

|
|