Appearance
付録D FPGA入門
集積化はハードウェアハッカーの宿敵だ。僕たちはものを分解し、改造し、改善することが好きなのに、時代の流れはすべてを1〜2個のASIC(Application Specific Integrated Circuit、特定用途向け集積回路)に詰め込む方向へ向かっている。こうした集積化は凡人の手の届かない領域にある。チップ上の回路パターンを定義するためのマスクセット1組が、あっという間に100万ドルに近づいているからだ。つまり、チップを1種類リビジョンするたびに100万ドルがかかる。間違いを犯して新しいマスクセットが必要になれば、また100万ドルを出さなければならない。
幸いなことに、チップ1種類に100万ドルをキャッシュで前払いするのは、多くの企業にとっても無理な話だ。そのため、FPGA(Field Programmable Gate Array、フィールドプログラマブルゲートアレイ)という市場が生まれた。FPGAとは汎用の「再構成可能な」プログラマブルハードウェアデバイスであり、多くのアプリケーションでASICの代替として使える。
FPGAとは何か
FPGAとは「フィールドプログラマブルゲートアレイ」の略だ。つまり、エンドユーザーが現場でプログラムできるゲートの配列だ。FPGAは「自宅で作れるカスタムシリコン」と考えることもできる。ただし、近年の部分的再構成や文脈依存の再構成への対応が、ASICにはない次元をFPGAに加えている。ASICは量産時の単価では安く、クロック速度も高くできるが、FPGAは少量〜中程度の量産用途やプロトタイプ開発において定番のツールとして確立している。
FPGAの基本アーキテクチャは、柔軟な配線ネットワークに埋め込まれたハードウェアプリミティブの配列だ。FPGAの強みは、複雑な計算をより単純な論理関数の連鎖に分解できるという点にある。
図D-1: 典型的なFPGA構造のブロック図。FPGAが持つ配線量と演算ロジック量の差異を示している。現代の高性能FPGAには、このような基本セルが数万個含まれている。
これらの単純な関数はさらに分解でき、最終的に計算全体がFPGAのハードウェアプリミティブにマッピングできる基本論理演算の連鎖で記述される。同じFPGAでも、ハードウェアプリミティブと配線ネットワークの構成を変えるだけで、マイクロプロセッサにもビデオコントローラにも○×ゲームにもなる。
FPGAアーキテクチャが実装するハードウェアプリミティブの種類は、特定のターゲットアプリケーションに対するFPGAの実装効率に大きく影響する。現代のFPGAが設計者に提供するプリミティブは、主に1ビット幅のものだ。具体的には「4入力または5入力から1ビット出力へのルックアップテーブル」と「フリップフロップ」と呼ばれる1ビットのタイミング同期ストレージ素子だ。ルックアップテーブルを論理プリミティブとして使うのは、入力数と同じ数の項を持つどんな論理演算でもプログラムできるからだ。これらのプリミティブは巨大なプログラマブル配線ネットワークに接続される。高性能なFPGAだと、こうした基本要素が数万個含まれる。
単ビット幅の構造は非常に汎用的だが、データ幅が大きいアプリケーションでは面積効率が悪くなる。実際、多くのFPGAでは面積の約1パーセントしか実際の論理プリミティブに使われておらず、残りはコンフィギュレーションメモリと配線に使われている。この膨大な配線は、1ビット幅の用途で必要となる多数のルーティングの組み合わせを処理するために必要だ。
面積効率を高めるため、多くのFPGAはRAMの塊や乗算器ブロックなどの粗粒度プリミティブもいくつか搭載している。XilinxのVirtex II-Pro FPGAはチップ上に複数のPowerPCコアまで搭載している。これは印象的に聞こえるが、そのコアが実際に消費する面積は驚くほど小さい。PowerPCプロセッサが消費するシリコン面積はおそらく1mm²強程度で、FPGA全体の面積(数百mm²)と比べると微々たるものだ。
最近のFPGAは非常に柔軟な演算ハードウェアに加え、非常に柔軟なI/Oも備えている。典型的なFPGAはPCI、AGP、LVDS、HSTL、SSTL、GTLを含む最新の高速シグナリング規格のほぼすべてに対応できる。さらにDDRクロック信号も扱えるFPGAがほとんどだ。これらの略語が何を意味するかわからなくても、基本的な考え方はシンプルだ。FPGAはXboxのような典型的なPCマザーボードにあるあらゆるハードウェアと通信するために使える。これはハードウェアハッカーにとって最高のニュースだ。FPGAはPC内のほぼあらゆるチップのエミュレーションやモニタリングに使えるからだ(もちろん、FPGAがPCの速度に追いつけない場合はPCをダウンクロックする必要があるが)。
FPGAの設計
典型的なFPGA設計フローには、複数の設計エントリ手法がある。グラフィカルに考えるのが好みなら、多くの設計フローはスケマティックキャプチャツールをサポートしている。スケマティックキャプチャはハードウェア設計にとって直感的なことが多いが、保守や修正が難しくなりがちだ。たとえば、ネット名のすべての出現箇所を変更しようとすると、すべての配線をクリックして新しい名前を入力しなければならず面倒だ。さらに、設計階層の1レベルの規模はスケマティックシートのサイズに制限されるため、複雑な設計ではスケマティックキャプチャだけでも相当な計画と先見の明が必要になる。
そのため、複雑な設計を実装する場合はHDL(Hardware Description Language、ハードウェア記述言語)が主流のツールだ。HDLは一見すると普通のプログラミング言語によく似ている。たとえばVerilogの構文はCやJavaに非常によく似ている。しかし、言語のセマンティクス(意味論)の理解は少し難しい。
ハードウェアにはCのような手続き型言語では表現できない固有の並列性がある。FPGAのすべてのゲートとすべてのフリップフロップは並列に計算できるのに対し、Cプログラムでは基本的に単一スレッドの実行が想定されている。そのため、HDLではハードウェアを並列動作するプロセスの集合として表現する。コンパイラがプロセスをゲートに変換する方法を理解できるよう、すべての関数を正しいプロセスにグループ化するのはコーダーの仕事だ。
図D-2: 典型的なFPGA設計フロー。HDL記述やスケマティックキャプチャから始まり、コンパイル、マッピング、配置配線を経て最終的なコンフィギュレーションビットストリームが生成される。
たとえば、Verilogにおける単一のクロック付き記憶素子(フリップフロップ)は、通常次のような構造を持つ「プロセス」だ。
verilog
input inData; // 入力と出力を宣言する
input clock;
reg bitOfStorage; // ストレージビットを reg 型として宣言する
always @(posedge clock) begin
bitOfStorage <= inData;
endこのコードは入力ポート inData の値を受け取り、クロックの立ち上がりエッジごとに inData を bitOfStorage という出力のフリップフロップに格納する。always @( ... ) begin ... end という構文で区切られた複数のプロセスを1つの設計に含めることができ、すべてのプロセスは並列に実行される。
組み合わせ論理もプロセスとして表現できる。たとえば、次のVerilogコードはクロックのない2入力マルチプレクサを実装している。
verilog
input a;
input b;
input select;
output out;
reg c;
always @(a or b or select) begin
if( select == 1'b1 ) begin
c <= a;
end else begin
c <= b;
end
end
assign out = c; // assign文にも論理関数を含めることができるこの例では、always キーワードに続く括弧内のブロックが「センシティビティリスト」であり、出力に影響する可能性のあるすべての入力が含まれている。センシティビティリストからパラメータを省略すると、そのパラメータが変化しても出力は変化しない。たとえば a と b をセンシティビティリストから省略すると、select が変化したときにのみ出力が変化する。つまり、select の状態に応じて a か b かを格納するラッチを作ったことになる。しかし、マルチプレクサの本来の動作は select が変化しないときでも a または b の変化を常に出力に伝えることなので、a と b の両方がセンシティビティリストに含まれていなければならない。
📦 コラム:FPGAのオーバークロック
FPGA向けのタイミングモデルはかなり保守的に設定されていることを知っておく価値がある。これは、タイミングアナライザが認める値よりはるかに高い周波数でFPGAが正常動作する可能性が高いことを意味する。実際、FPGAのロジックを丁寧に手動配置すると、スペックに明記された性能よりずっと高い性能を引き出すことができる。
たとえば、XboxのHyperTransportバスタップの実装に使ったFPGA(Xilinx Virtex-E)は、約200 Mbits/s/pinのデータレートしか仕様に規定されていないが、このアプリケーションでは400 Mbits/s/pinが必要だった。それを実現できた理由は、実際のロジックと記憶素子は非常に高速に動作できるのに、性能のほとんどがロジック素子間の信号を伝える配線とリピータで消費されているからだ。具体的には、400 Mbits/sでは遅延が大きすぎてデータを1クロックサイクル分実質的に記憶してしまう配線が出てくる。
低速な配線がどれかを見つけるために、データのシーケンスをキャプチャしてオシロスコープで事前に発見したパターンと比較した。低速パスを特定したら、遅延が少なすぎるチャンネルのクロックを反転させたりフリップフロップを挿入したりした。最終的には、時間スキューが補正された信号のセットができあがった。それらの信号は、従来のコンパイル済みHDL設計技術が使えるより低いクロックレートで簡単に分割できた。
この手法は非常に強力だが、汎用的ではない。配線による遅延はチップごとに異なり、周囲温度や電源電圧の品質といったパラメータに依存するからだ。ただし、制御された環境下で特定の1チップに限定すれば、定格の2倍の性能を引き出せた。このアプリケーションと一般的なアプリケーションとのもう一つの重要な違いは、数千回に1回程度のビットエラーが許容できたことだ。3回トレースしてXORすることでランダムノイズで失われた情報を回復できたからだ。しかし、通常のアプリケーションでは1万回に1回のビットエラーレートは許容できない。10兆回に1回以下の回復不能エラーレートのほうがより標準的だ。これは僕がよく言う格言に通じる話だ。「何かを1回やるのは簡単だが、それを100万回完璧にやることは難しい。」
HDLの習得には本書の範囲を超えた多くの微妙な点があるが、上記の2つのコードセグメントがどんなものを期待すべきかの雰囲気を伝えていると思う。熟練したソフトウェアプログラマは初心者よりHDLへの適応に苦労することがある。ソフトウェアの世界で当たり前のように使うトリックの多くが、直接的なハードウェア実装にはうまく変換されないからだ。配列、構造体、乗算、除算プリミティブはソフトウェアの世界では当然のように使えるが、それぞれが潜在的に大きく非効率なハードウェアブロックに変換される。さらに、ハードウェア実装では、case 文のすべての可能なケースが意図するかどうかにかかわらず存在する。case 文をデフォルトケースで完全に指定しないと、暗黙のケースを処理するための余分なハードウェアが合成されることが多い。VerilogのチュートリアルやシンタックスリファレンスはGoogleで大量に見つかる。verilog syntax や verilog tutorial は構文リファレンスやチュートリアルを探すときの良い検索キーワードだ。XilinxのウェブサイトにもFPGA設計者向けの優れたVerilogリファレンスがあるし、Sutherland HDL社は http://www.sutherland-hdl.com/on-line_ref_guide/vlog_ref_body.html で無料のVerilogクイックリファレンスガイドを公開している。
HDL設計エントリのもう一つの利点は、無料・有料の「ソフトコア」が利用できることだ。www.opencores.org のようなウェブサイトでは、USBインタフェース、DES・AES暗号エンジン、各種マイクロプロセッサなどの機能向けにGPLライセンスのHDLコアを提供している。さらに、ほぼすべての標準機能についてサードパーティベンダーが有償コアを販売している。
設計エントリが完了したら、ハードウェアにコンパイルする前に設計をシミュレーションすることを強くお勧めする。コードを少し変更してハードウェアに書き込んでプローブするというやり方でバグを追跡しようとするのは非常に非効率だ。シミュレーションならボタン一つで回路のあらゆるノードをプローブできる。また、コード変更をシミュレーションするのに必要な労力は、変更をハードウェアに書き込むまでの手間と比べると圧倒的に小さい。
設計のエントリとシミュレーションが済んだら、共通のネットリスト形式にコンパイルまたは変換する必要がある。このネットリスト形式はターゲットFPGAのハードウェアプリミティブにネットリストプリミティブをマッピングするプログラムに入力される。マッピングされたプリミティブは次に配置配線される。得られた設計は、設計者が指定した制約セットへの適合をタイミング解析で確認する。設計が仕様を満たさない場合は、配置配線を繰り返して反復的に改善される。設計が制約を満たすと、コンフィギュレーションビットストリームジェネレータに渡され、FPGAの内部表現が自己コンフィギュレーションに使える2進ファイルに変換される(最新のFPGA設計ツールでは、これらのステップすべてがボタン一つでほぼシームレスに実行される)。
プロジェクトのアイデア
FPGAとは何か、どうプログラムするかが少しわかったところで、実際に何ができるだろうか。
FPGAは今日、非常に印象的な範囲のタスクをこなせるだけの論理容量と性能を持っている。FPGAの明らかな産業的応用は、ハードワイヤードシリコン向けの設計エミュレーションだ。カスタムチップの製造コストは急騰しており、致命的なミスを犯した場合の修正コストが数十万ドル、あるいは数百万ドルに達することもある。
一方、FPGAのHDL記述でミスを犯した場合の修正コストは基本的に時間と設計工数だけで済む。部品を捨てる必要もなく、新しい部品を買い直す必要もない。そのため、多くの企業が最終シリコンの製造(テープアウト)前にFPGAでモックアップ設計を完全シミュレーションするという戦略を採用している。このアプローチの副次的な利点は、カスタムシリコンが製造中(数ヶ月かかることもある)の間に、シリコンのソフトウェア・ハードウェアチームがFPGAモックアップを使って設計の検証を始められることだ。
ハッカーにとってFPGAはあらゆる複雑なプロジェクトの万能薬のようなものだ。総当たりキー探索や大量データの高速暗号化に関心があるなら、暗号関数の実装に最適な選択肢だ。無料の乗算器とデジタルフィルタのコアが存在することもあって、信号処理関数の実装にも非常に有用だ。FPGAはDSPより低消費電力で高性能を達成でき、バッテリー駆動のロボティクスなどのアプリケーションで独自のニッチを持っている。FPGAは組み込みコントローラ用途にも役立つ。今日のFPGAにはPIC相当以上の小型マイクロプロセッサコアが簡単に収まる。シリアルポートやPWMタイミングジェネレータなどのカスタムハードウェアペリフェラルをすべて追加すれば、準備完了だ。
FPGAは数値演算に重点を置かない場面でも役立つ。FPGAはタイトなスペースでの論理設計エラーを修正する「グルーロジック」として優れており、うまく配置されたFPGAがあれば、論理設計エラーのパッチとして基板にジャンパ線を追加する必要をなくせる。また、1万ドルのTek TLAメインフレームを買えない僕たちにとって、FPGAは安価なロジックアナライザの代替にもなる。最新FPGAの高速I/O能力と自動生成されたFIFO設定の組み込みメモリを組み合わせれば、信号キャプチャ・解析システムの設計は大幅に楽になる。
最後に、FPGAは一見すると明らかでないアナログ・デジタル混在(ミックスドシグナル)の場面にも応用できる。最も一般的なミックスドシグナル用途はおそらくVGAモニタのアナログ信号をFPGAで駆動することだろう。抵抗分圧器を2つ用意するかよく選んだ出力ドライバタイプを使うだけで、カラー画像を生成するのに必要なタイミングとロジックはすべてFPGA内部のロジックで処理できる。FPGAはPWM方式のD/Aコンバータとしても、シグマデルタD/AコンバータやA/Dコンバータの一部としても、ほとんど手間をかけずに使うことができる。
購入先
これほど汎用性が高くて強力なツールは高価に違いないと思っているかもしれない。10年ほど前はその通りだったが、今日では10万ゲートのFPGAを50ドル以下で購入でき、設計ツールは教育ユーザーや趣味のユーザーに対して無料で提供されることが多い。
もちろん、FPGAだけでは使えない。使うためには適切な接続が施されたボードに実装する必要がある。そのためにXESS(www.xess.com)という会社が比較的手頃なFPGAスターターキットのラインナップを提供している。製品ラインナップは新しいFPGAが登場するたびに変わるが、執筆時点でのエントリーレベルのFPGAボードはXSA-50で、5万ゲートのFPGAが搭載されて約150ドルだ。このボードにはRAM数メガバイト、パラレルポート、VGAポート、PS/2キーボードポート、その他いくつかの必須アイテムも含まれている。
もう一つの選択肢は、大胆に自分でゼロからボードを作ることだ。本書の他の付録でボードレイアウトと製造への入門方法、ファインピッチのFPGAデバイスを基板に取り付ける方法を説明している。自分でボードを作ってみるのは実際非常にやりがいがある。挑戦してみることをお勧めする。今日ではボードの製造コストは100ドル以下なので、ボードが動かなくても大きな損失にはならない。
自作ボードを作る場合は、XilinxのディストリビュータからFPGAを購入する必要がある。Xilinxのウェブページ(www.xilinx.com)に最新のディストリビュータへのリンクがある。執筆時点で比較的便利なディストリビュータの一つはNuHorizons(www.nuhorizons.com)で、登録や特別な顧客アカウントなしに製品の在庫状況と価格情報をウェブページで確認できる。
FPGA開発ソフトウェアは通常、低価格または無料で入手できる。たとえばXilinxはVirtex-II(300Kゲートまで)、Spartan II-E、CoolRunnerラインの部品向けに無料の開発環境を提供している。この開発環境はXilinx ISE WebPACKと呼ばれ、www.xilinx.com での登録後にダウンロードできる。この無料環境はスケマティック・HDL入力、HDL合成、フロアプランナ、タイミング駆動の配置配線、タイミング解析、消費電力解析ツールを含む印象的な機能リストを誇っている。
Xilinxはまた、Prentice-Hall経由で「Xilinx Student Edition」と呼ばれるバージョンも提供している。このソフトウェアにはFPGA設計を学ぶのに役立つ多数のチュートリアルとドキュメントが同梱されている。XilinxのウェブサイトではEducationタブの下に幅広いチュートリアルや講義が用意されている。
*原著*: *Hacking the Xbox: An Introduction to Reverse Engineering* © 2003 Xenatera LLC*著者*: Andrew "bunnie" Huang | *出版*: No Starch Press
*日本語訳・レビュー*: ニコ技深圳コミュニティ / 高須正和(@tks) — [https://takasumasakazu.net](https://takasumasakazu.net) — CC BY-NC-SA 1.0
*注記*: 本翻訳は、原著の Creative Commons ライセンス条件に従って公開する翻訳コントリビューションであり、著者 bunnie からも歓迎のコメントをいただいています。出版社による公式日本語版ではありません。