DAS/SWEST共同招待講演 システムLSIのC言語ベース設計の現状と将来 NEC システムデバイス研究所 システムCAD 若林一敏 日時:2006/07/13 14:50〜16:10 聴講者:200人程度 座長:浜口(阪大) ---------------------------------------------------------------- プレゼンテーション ---------------------------------------------------------------- ○C言語設計の概要と動作合成の(基礎)原理=動作合成とは? ・ANSI Cでハードの設計・検証を全部行う ・RTLを書かずに、バスなども全部自動合成 ・RTLのデバッグは遅いから、C言語の記述で済ませてしまう ○HW/SWの開発環境 ・HWもSWも同じ環境でお互い話し合って開発⇒SoC設計もSW的開発 ・システム設計⇒機能設計(動作合成ツールCyber)⇒RTL記述 ・等価検証もCで行う ・設計レベルによる規模の違いの例 *ゲート回路(100万ゲート)<RTL(30万行)<C(4万行) ○C設計による向上率 ・記述効率の向上(4〜20倍) 平均約7倍 ・検証速度の向上(50〜200倍) ○動作合成を用いた設計の実例 ・動作合成で作ったチップ:ex.携帯502i *もう実際に使われている技術(toy techではない) ○なぜC言語? ・人間が協調できるだけでも、効果が大きい ・Cで全部設計:制御系回路・データ処理系回路 ⇔使い分ける(制御系は手で書く)のが大事だと言う人もいるが、全部Cで。 ・CからRTLを出すだけでなく、HW/SW協調シミュレーション(デバッグはC) ・Cソースで形式プロパティ検証 ・動作合成:Cコンパイラ(コンパイラにバグがあっても手で直せる) ・なるべくRTLを見ないで設計 ○CyberWorkBench ・Cソース、生成されたRTL、対応するデータパス図:全て対応関係が目で見て分かるようなGUI ○動作合成による利点 ・RTL言語による構造記述(論理合成):1パターンしか得られない ・Cによる動作記述(動作合成):数パターンの回路が得られる⇒色々なパターンを試してみるべき ○動作合成の特徴 ・同じC言語の記述から、使用するハードウェア資源の制約によって、異なる回路を生成できる 1.データフローグラフ 2.スケジューリング(演算器制約):何状態で実現可能か? 3.データパス生成:Cに書いた通りの回路(大きすぎ) 4.最適化:オペランドの交換 5.最適化:レジスタの共有(セレクタも減る) 6.FSMD:FSM+Datapath ○(局所的)広域スケジューリング ・ハードは並列化が重要 ・記述順の実行:5ステップ⇒投機実行:3ステップ ・複数のIF文の並列化:Cで自分で書き直すのは大変⇒コンパイラ任せにする ・スーパースカラ:並列を5以上にしても変わらない *コンパイラの並列化だけで、6倍速くなる ○データパス割り当て(バインディング)の例:逐次割り当て ・割り当て方法によって、コストが変わる(論理的な演算を物理的な演算に結びつける ・スケジューリング&バインディング:CDFG上で行う ・演算器:ノード レジスタ:演算間の線に配置。 ○なぜこんなことが実現しなかったのか? ・人手並みのRTLにならなかったから。 ・基本ブロックのスケジューリング、バインディングは全体のごく一部 ・合成系 1.配列、ループの最適化(分岐やGOTO文) 2.関数の扱い 3.パイプライン 4.大域的な並列化 5.ポインタ +言語レベル最適化(非常にやることが多い) ・演算処理順序を変える⇒精度が変わる ○C言語設計によるLSI設計手順 ・リファレンスモデル作成⇒HW/SWの分担決定 HW:動作レベルC作成⇒動作合成⇒サイクル精度検証 ○HW/SW協調検証・システム検証 ・この時点での検証によって、設計をやり直すことが可能 1.HW生成にかかる時間が短い 2.手で設計している場合、ここまで来るまでの時間が非常に長い ○動作合成の回路品質は人手設計に劣るか? ・面積、遅延、性能、電力 ・テスト容易性、修正 *オプションの意味の理解が必要 ○面積と速度のトレードオフ ・同じ土俵で勝負しない ・動作記述のCは、再利用性が高い。 異なる要求仕様がある場合、RTL設計では一点しか設計できない⇔動作合成は、1つの記述からたくさんのRTLを生成できる ・同じポイントで勝負したら人手の方が勝るかもしれないが、動作合成の場合、同じ記述のCから複数の回路パターンを生成可能 ・再利用性が高いと、一日で別の仕様のチップを生成可能 *周波数の違う回路(33,54,108MHzの3パターンの回路) ・人手設計では考慮外の回路も設計(深いシーケンスを持つ回路の生成)可能 *シーケンスが深いとデバッグが大変:人手設計が困難 ○回路の比較 ・人手:RTレベル設計=構造設計(状態遷移)(loop unrolling):状態数3⇒面積:大、遅延:大 ・動作合成:Cのfor文で記述:FSMで実現(loop rolling):状態数35⇒面積:小、遅延:小 *人手設計では、普通ありえない形式まで考えられる ○複雑大規模な制御の実現 ・人手設計:入力:23KL in BDL(C) 制御回路:1000状態 面積:150Kgate *ファームウェア制御しか設計できない ・動作合成:スピード40%アップ、面積:30%削減、デザインTAT:1/10 ○大規模FSM ・遅延制御:人手設計に勝てる ・遅延:状態でコード遅延大⇒FSMを任意の大きさのFSMに自動分割⇒制御回路の遅延を任意の値 ○カスタムプロセッサ ・面積は、若干(5%分)負けたが、少ない工数で等価の品質(ASIP設計は工数がかかりすぎる) ・Verilogで1万行書くのはきつい ・シミューション速度が200倍違う(動作合成:61Kc/s, 人手:0.3Kc/s) ○タイミングクロージャ(遅延収束) ・動作レベルで遅延改善⇒良いRTL記述生成 ・早い段階で、どんどん違うRTLが生成できる⇒2時間で面積40%削減 *速く良いRTLが得られる ・同じところまでやろうとすると、人手では4日かかる *RTLはバグを気にして、あんまり大きく書き換えられない ○動作合成の利点 1.全く違うアーキテクチャが提案できる 2.分割損:少人数で開発可 3.RTLはデバッグ性重視⇒人間の限界 *レジスタのシェアをすると、デバッグが出来なくなる *最初にチップを作る時はデバッグ性重視で、面積が小さくならない ・RTLでは考慮外のHW/SW分割を、動作合成で行うことで、電力削減&設計容易 ・ハードウェア分割⇒並列処理が可能 ○注意点 ・ハードウェア向けアルゴリズムにしないと負ける *SW向けアルゴリズムを動作合成しても、あまりいい回路ができない ex.for文で全て配列に入力後、処理 ⇒入力後になるべく早くその値を使った処理を行う *必要メモリ量を削減し、高速なHW向けアルゴリズムとすれば、人手と同等の回路) ○C言語の並列化をしないと負ける ・1つのプロセスとして合成するより、2つのプロセスとして合成 ・検証の終わったソースを分割して、2つのプロセスにして並列動作 *そうしないと、必要以上にクロック数がかかる ○設計期間処理+画質 ・RTL設計:各ブロックごとに設計⇒10ヶ月 ・C設計全体を1つのCプログラムで設計⇒1.5ヶ月 *人手の設計で、1番時間がかかったところは、画質の設計だった ○チューニングしやすい ・Verilogの行数と論理合成によるゲート数は、必ずしも線形関係ではない *上手い具合に良い回路が生成できないパターンに当たることもある。 ・動作合成では、段階的に改良していけるが、RTLでは大局アーキテクチャは徐々に変更していくことは困難 *HWの設計だが、SW的な反復設計法を適用できる。 ○まとめ ・同じ期間であれば、動作合成の方が優れている ・1つの記述から、全く違うアーキテクチャが複数生成できる ・アルゴリズムを色々試すことが容易 ○問題点 ・言語レベル最適化がまだまだ弱い ・どんなCでも高速なコードを生成できるわけではない。 *形式検証:プロパティ検証 *C言語では、CF直前まで、設計アルゴリズムの改良が可能 ---------------------------------------------------------------- 質疑応答 ---------------------------------------------------------------- Q.性能を出すためのノウハウは? A.そのまま使える。そんなに万能ではないが、合成したものを手直しせずに使用できる Q.RTL設計に比べ、チューニングの大変さの他に手間が増えることはあるか? A.変えたらすぐ結果が出るので、やりやすい。RTLはそこにたどり着くまでに時間がかかる。 むしろ、チューニングはやりやすくなっていると考えている Q.SWをHWに置き換えれば速くなり、SWもHWやファームウェアにした方がいいものがある。HWでは実現できない部分があるのでは? A.プログラマビリティはSW。速度や電力系はHW。OSコード系はHWでは実現不可能。 Q.RTLとゲートの相関関係が分かっているが、Cとゲートの結びつきが良くわからない。 A.動作合成をやっているからと言って、ECOがなくなったというわけではない。 Cから生成されたRTLを手直しすると場合もある。 Cyberなら、GUIでゲートから直すことも可能。