Comments
Description
Transcript
ビヘイビア合成の基本処理ステップ
デバイスの記事 第3回 ビヘイビア合成の基本処理ステップ 桜井 至 今回は,ビヘイビア合成の処理手順について解説する.ビヘ 紹介しました.ビヘイビア合成で用いるSystemC構文は, イビア合成では,ビヘイビア・モデルにクロック・サイクル BCA(bus cycle accurate;バス・サイクル精度)モデルに を導入したり,クロック・サイクルをまたいで演算リソース 基づいて,ビヘイビア合成の対象となるC/C++アルゴリ を移動させることによって,面積や性能(クロック周期やレイ ズムと外部システムを接続する入出力インターフェース, テンシ)の最適化を図る.ビヘイビア合成の処理そのものは入 およびそれに伴うクロック・サイクル動作を定義するため 力言語に依存しない.SystemC でもHDL でもほぼ同じ処理 のものと言えます.そのため,アルゴリズムと外部のハー 手順をとる. ドウェア・システムを接続するラッパを作成することと見 (編集部) なすこともできます. 前回は,ビヘイビア合成で用いるSystemC構文について 今回は,ビヘイビア合成の基本的な処理フローとそれぞ れの処理ステップについて紹介します. 文法処理 ● 一連の手順でビヘイビア記述をRTL 記述に変換 図1に,標準的なビヘイビア合成の処理ステップを示し アルゴリズム最適化 ます.それぞれのビヘイビア合成ツールによって処理順序 や内容が異なる場合がありますが,基本的なステップには コントロール・ データ・フロー解析 あまり大きな差はありません. まずは,C++コンパイラに基づいた文法チェック処理と ライブラリ処理 演算アルゴリズムの最適化を行い,入力記述のコントロ ール・データ・フローを解析します.論理合成でも同じよ リソース・アロケーション うな処理を行いますが,ビヘイビア記述はRTL(register transfer level)記述と比べて抽象度が高く,より少ないコ ードで機能を記述できます. スケジューリング 次に,演算子の実現に必要な演算リソース(加算器,乗 算器など)の作成,またはライブラリからの選択を行い,リ 図1 ビヘイビア合成の基本処理ス テップ 演算ユニット・バインディング ビヘイビア合成の基本的な処理 ステップを示す.それぞれのビ ヘイビア合成ツールによって処 理順序や内容に若干の違いはあ るが,基本的な処理ステップに 大きな差はない. レジスタ・バインディング ソース・アロケーション(resource allocation)を行った後, クロック周期やレイテンシなどのタイミング制約条件と, 138 Design Wave Magazine 2005 February 演算リソースの持つタイミング遅延値に従ってスケジュー リングを実行します. スケジューリングは,演算リソースの持つタイミングと 出力処理 クロック周期に依存します.例えば,図2に示したように 図2 タイミングによるスケジューリングの違い スケジューリング結果は,クロック周期と演算 リソースが持つ入出力遅延に依存する.y= (a+b)*cという式に対して,加算器の遅延が 5ns,乗算器が10nsとすると,クロック周期 20nsでは1サイクルで加算と乗算を実行でき る.周期10nsでは加算と乗算がそれぞれ別の サイクルで実行され,2サイクルとなる.周期 5nsではパイプライン乗算器が必要になり,合 計3サイクルとなる. リスト1 y=(a+b)*c:加算器の遅延が5ns,乗算器が10nsの場合 パイプライン 乗算器 a b a + c a + b * y (a)クロックが20ns ビヘイビア合成を実行する記述例 typedef sc_uint<8> uint8; sc_uint<33> example_func( uint8 a, uint8 b, uint8 c, uint8 d, uint8 e ) { sc_uint<33> y; y = ( ( a * b ) + c ) * ( d * e ); return y; } b c という式で,加算器のリソースの持つ最大遅延値が5ns, c (b)クロックが10ns 表1 * y (c)クロックが5ns SystemC/C++ サポート構文 モジュール,スレッド C++構文 SC_MODULE すべてのC++演算子 SC_CTHREAD 配列メンバ/ローカル変数 watching() if/else構文 ポート for()ループ,while()ループ sc_in<> switch()構文 sc_out<> ポインタおよび参照 ポート・タイプ y = (a + b) * c; y * + bool クラスおよびクラス・テンプレートの インスタンス化 sc_int<> ファンクション・テンプレート sc_uint<> 継承 sc_bigint<> 演算子のオーバロード sc_biguint<> sc_fixed<> 乗算器の最大遅延値が10nsであるとすると,クロック周期 が20nsの場合,加算と乗算を一つのクロック・サイクルで 実行できます.クロック周期が10nsであれば,加算と乗算 証とHDLによるRTL検証の両方を実行することができま を別々のサイクルで実行する必要があります.クロック周 す.ビヘイビア・シミュレーションの実行結果とRTLシミ 期が5nsであれば,乗算処理をパイプライン化したパイプ ュレーションの実行結果を比較して,機能が一致している ライン乗算器を用いて合計3サイクルで演算を実行します. かどうかを確認できます注. 正確なスケジューリングを実行するには,正確な演算リソ ースの遅延値を求める必要があります. 次に,スケジューリングの結果に従って,演算リソース ● ビヘイビア合成を構成する九つの処理ステップ 以下,各処理ステップに対してもう少し詳細なビヘイビ とレジスタに対する共有化とバインディング(binding)を行 ア合成の手順を紹介します.また,実際の処理例として, います.そして,最後にビヘイビア合成の出力データとし リスト1に示した記述を含めて紹介します. て,データパス部とステート・マシン部で構成されたRTL 1)文法処理 記述を生成します.RTL記述をSystemCコードとして生成 文法処理のステップでは,C++/SystemCのビヘイビア した場合,OSCI( Open SystemC Initiative;SystemCの 記述がビヘイビア合成可能かどうかをチェックし,データ 標準化/普及推進組織)のリファレンス・シミュレータを用 構造をビヘイビア合成ツールが定義するフォーマットに合 いてシミュレーションすることができます.また,RTL記 わせて変換して,内部データベースに格納します.文法処 述を論理合成可能なVerilog HDLコードまたはVHDLコー 理では,一般的にC++コンパイラの技術を流用しています. ドとして生成した場合,その後,論理合成を実行して,既 存の設計フローへ進むことができます. SystemCはクロックの概念を持っています.そのため, SystemCとHDLの混在が可能なシミュレータを使用した 場合,同一のSystemCテストベンチを用いてビヘイビア検 注:論理合成の前後でRTLの設計データとゲート・レベルの設計データを 静的に比較する技術として,フォーマル・ベリフィケーション(形式的 検証)が利用されている.ビヘイビア・レベルを対象とするフォーマル・ ベリフィケーション技術は,まだ,研究段階にある.そのため,ビヘイ ビア合成の前後で機能が一致しているかどうかは,シミュレーションに よって確認する必要がある. Design Wave Magazine 2005 February 139