入門 · レッスン 2 / 10

FPGAはどのようにプログラムされるか

ハードウェア記述からコンフィギュレーション済みチップまでの道のりを段階ごとに追い、AMD、Altera、Lattice、オープンソースフローで出会うツール名を紹介します

入門AMDAlteraLatticeオープンソース25 分更新 2026年11月13日無料期間 2027年1月31日

このレッスンで学ぶこと

  • RTLからコンフィギュレーション済みデバイスまでのFPGA設計フローの各段階を挙げ、それぞれが何を生成するかを述べられる
  • SRAM、フラッシュ、アンチヒューズの各コンフィギュレーション方式を区別し、それぞれを選ぶ理由を1つ挙げられる
  • フローの各段階を、AMD、Altera、Lattice、オープンソースツールチェーンで使われるツール名に対応付けられる
  • 制約が後付けではなくフローへの入力である理由を説明できる

前提レッスン: FPGAとは何か

レッスン01では、FPGAをプログラムするとはコンフィギュレーションメモリを埋めてチップを自分の回路にすることだと述べました。本レッスンでは、入力したテキストからコンフィギュレーション済みデバイスまでの道のり全体を追います。まだツールを動かす必要はありません。後のレッスンでVivado、Quartus Prime、Radiant、あるいはYosysスクリプトを開いたとき、画面上のすべてのステップに、すでに知っている名前と目的があるようにすることが狙いです。

フローを一枚の図で

RTL.v / .vhd files合成記述からゲートへネットリストLUT、FF、配線配置配線位置決めと配線Bitstream.bit / .sof制約クロック周期、ピン位置、I/O規格シミュレーション合成前後の動作を確認書き込みJTAG/フラッシュタイミング報告制約を満たしたか
FPGA設計フロー。各段階は前の段階の出力を消費します。制約は合成時と配置配線時に入力されます。シミュレーションはRTLに対しても、それ以降のどのネットリストに対しても実行できます。

これらの段階は、どのベンダーのツールでもオープンソースフローでも同じです。ボタンに書かれた名前は異なり、終盤の節で対応付けます。

段階1: RTL

まず、ハードウェア記述言語(通常はVerilog、SystemVerilog、またはVHDL)で回路の記述を書きます。この記述はレジスタ転送レベル(register transfer level)を略してRTLと呼ばれます。各レジスタが各クロックエッジでどの値を取り、レジスタ間にどんな論理があるかを記述するからです。これはプレーンテキストです。小さなプロジェクトなら数百行のファイルが数個、大きなプロジェクトなら数千のファイルになります。

RTLはプログラムではありません。そこに書かれたすべての文が、完成したチップの中に同時に存在します。レッスン05で最初のファイルを書きます。今のところは、RTLを、後のすべての段階が正確に保存しなければならない「真の情報源」と考えてください。

RTLと並行して制約を書きます。最も重要な制約は、クロックがどれだけ速く動くかをツールに伝えるものです。「clkの周期は10 ns」と書かれた1行が、フローの残りの部分に、論理が時間内に落ち着くかどうかを検査させます。他の制約は、信号を物理ピンに割り当て、各ピンの電圧規格を設定します。AMDはこれをXDCファイルに、AlteraとLatticeはSDCファイルに格納し、どちらの形式もTclに似たテキストです。制約は任意の付け足しではありません。クロック制約がなければ、ツールは設計が動くかどうかを教えてくれませんし、ピン制約がなければ、LEDは適当なピンに割り当てられてしまいます。

段階2: 合成

合成はRTLを読み、ネットリスト、つまり論理プリミティブとそれらの間の配線のリストに変換します。プリミティブは、ターゲットデバイスが提供するものです。ルックアップテーブル、フリップフロップ、キャリーチェーンのセル、ブロックRAM、DSPブロック、I/Oバッファです。if文はマルチプレクサになり、加算はキャリーセルの連鎖になり、case文はいくつかのLUTになり、コード中の配列は、十分に大きくツールが認識できる形で書かれていればブロックRAMになります。

合成は最適化も行います。出力が使われない論理を除去し、重複する論理を統合し、ブール式を簡略化します。32ビットのカウンタを書いて最上位ビットしか読まなくても、各ビットが次のビットに影響するため合成は32ビットすべてを残しますが、値を計算して何にも接続しなければ、それは消えます。合成が出力するレポートは、設計が使ったLUT、フリップフロップ、RAM、DSPの数を伝えてくれるので、毎回読むべきです。予想外にリソースをまったく使っていない設計は、たいてい配線ミスのせいで出力が最適化で消えています。

出てくるネットリストは、ある意味ではまだデバイス非依存であり(チップ上のどこに何が置かれるかはまったく分かっていない)、別の意味ではデバイス固有です(そのファミリーのプリミティブを使っている)。小さな設計の合成は数秒で終わります。大きな設計では数十分かかります。

段階3: 配置配線

配置配線(AMDではインプリメンテーション、Alteraではフィッティングと呼びます)は、ネットリストとデバイスを受け取り、2つの決定を行います。配置は、すべてのプリミティブに物理的な位置を選びます。このLUTはあのスライスに、このフリップフロップはその隣に、このRAMはブロックRAM列3に、という具合です。次に配線は、ネットリスト中のすべての配線について、プログラマブルな相互接続を通ってソースからすべての宛先に至る経路を選び、特定のスイッチの組を閉じます。

どちらの決定もタイミングに制約されます。ツールはすべてのLUTとすべての配線セグメントの遅延を知っており、制約からクロックが100 MHzで動くことを知っています。あるフリップフロップから次のフリップフロップへのすべての経路について遅延を合計し、その合計が、フリップフロップ自体が必要とする時間を除いた10 nsに収まるかを検査します。収まらなければ、ツールは別の配置、より短い経路、またはその両方を試します。配置配線が小さな設計で数分、大きな設計で数時間かかり、ときに失敗するのはこのためです。結果はタイミングレポートで、設計中の最悪の経路についてどれだけのスラックが残っているかを示します。正のスラックは、要求したクロックで設計が動くことを意味します。負のスラックは動かないことを意味し、設計を修正するかクロックを下げなければなりません。

段階4: ビットストリーム生成

すべての位置とすべてのスイッチが決まると、ツールはビットストリームを書き出します。これは、チップ上の設定可能な要素1つにつき1ビットを含むファイルです。各LUTの真理値表の64ビット、各フリップフロップのモードビット、各配線スイッチの状態、各I/Oブロックの駆動能力と規格、そしてすべてのブロックRAMの初期内容です。このファイルは正確に1つのデバイス専用です。XC7A35T用のビットストリームは、同じArtix 7であってもXC7A100Tをコンフィギュレーションできません。

ビットストリームは大きなファイルです。小型部品であるAMD XC7A35Tでも約17.5 Mbのコンフィギュレーションデータ、ディスク上でおよそ2.2 MBが必要です。大型デバイスでは数百メガビットになります。形式はAMDとAlteraではプロプライエタリですが、オープンソースコミュニティがLattice iCE40とECP5、いくつかのGowinファミリー、一部のAMD 7 Series部品についてリバースエンジニアリングしています。

ビットストリームの暗号化と認証はハードウェアセキュリティのトピックで扱います。

段階5: コンフィギュレーション

最後のステップは、ビットストリームをチップに入れることです。その仕組みは、デバイスがコンフィギュレーションを保持するのに3つのメモリ技術のどれを使うかによって異なり、その選択が電源投入時の部品の振る舞いのすべてを決めます。

SRAMベースのデバイス

AMDとAlteraのすべての部品、Latticeのほとんどの部品を含む大半のFPGAは、コンフィギュレーションをスタティックRAMに保持します。SRAMは高速で、論理と同じ最先端プロセスで作られ、何度でも書き換えられます。一方で揮発性です。電源を切るとコンフィギュレーションは消え、次の電源投入時にはチップは白紙です。

したがってSRAMベースのFPGAは、起動のたびに読み込んでくれる何かを必要とします。製品では通常、FPGAの隣に置かれた小さなシリアルフラッシュチップがその役目を担います。電源投入時にFPGAはSPIに似たインターフェースでフラッシュからビットストリームを読み出します。これにかかる時間は、ビットストリームのサイズとインターフェースの幅に応じて数ミリ秒から数百ミリ秒です。あるいは、ボード上のプロセッサがパラレルまたはシリアルのコンフィギュレーションポートを通じてビットストリームを供給することもできます。作業机の上ではこれらをすべて飛ばし、PCからJTAG経由でビットストリームを直接SRAMに読み込みます。「program device」ボタンが行うのはこれです。JTAGによる読み込みは電源を切るまで保持され、その後は失われます。

フラッシュベースのデバイス

一部のファミリーは、コンフィギュレーションをオンチップのフラッシュメモリに格納します。MicrochipのPolarFireとIGLOO2ファミリー、LatticeのMachXOファミリーがこの方式で、Lattice iCE40部品にはワンタイムプログラマブルのオンチップメモリがオプションとしてあります。フラッシュベースのデバイスは、読み込むものがないため電源投入から数マイクロ秒で動作し、外部のコンフィギュレーションチップを必要とせず、設計をボード上のバスから読み取ることもできません。代償は、SRAM部品より1〜2世代遅れたプロセス技術、限られた書き換え回数(無制限ではなく数百から数千回)、そして遅い書き込みです。フラッシュ部品は、低消費電力、セキュリティが重要、即時起動が必要な用途に向いています。

アンチヒューズデバイス

アンチヒューズは、プログラミング電圧によって永久に閉じられるまでは開いているリンクです。Microchip(旧Actel)が宇宙・防衛向けに製造するアンチヒューズFPGAは一度だけプログラムされ、二度と変更できません。そのコンフィギュレーションは放射線によるアップセットの影響を受けず、読み出すこともできないため、人工衛星に搭載されます。一方で高価で、小さな論理容量と古いプロセスでしか提供されず、設計ミスはチップの廃棄を意味します。その居場所は宇宙と高信頼性のトピックです。

技術 揮発性 書き換え回数 外部ローダ 起動時間 典型的な用途
SRAM あり 無制限 必要(フラッシュまたはプロセッサ) 数ミリ秒から数百ミリ秒 ほぼすべて
フラッシュ なし 数百から数千回 不要 数マイクロ秒 低消費電力、即時起動、セキュリティ
アンチヒューズ なし 1回 不要 数マイクロ秒 宇宙、防衛

誰が何と呼ぶか

どのベンダーも同じ段階を異なる名前でパッケージしています。表で対応付けます。Microchip(Libero SoC)、Efinix(Efinity)、Gowin(Gowin EDA)も同じパターンに従い、ツールチェーンのリファレンスで扱います。

段階 AMD Vivado Altera Quartus Prime Lattice Radiant / Diamond オープンソースフロー
RTL入力 任意のエディタ、またはVivadoのエディタ 任意のエディタ、またはQuartusのエディタ 任意のエディタ、または内蔵エディタ 任意のエディタ
制約 XDC(Tcl) SDCに加えてピン用にQSF SDCに加えてピン用にPDC(Radiant)またはLPF(Diamond) ピン用にPCF(iCE40)またはLPF(ECP5)、クロック用にSDC
合成 Vivado合成(synth_design) Analysis and Synthesis Synplify ProまたはLattice Synthesis Engine Yosys
配置配線 インプリメンテーション(opt_design、place_design、route_design) Fitter Map、Place and Route nextpnr
タイミングレポート report_timing_summary Timing Analyzer Timing analysis nextpnrのタイミングレポート
ビットストリーム write_bitstream、.bitを生成 Assembler、.sofと.pofを生成 Bitstream generation、.bitを生成 icepack、ecppack、gowin_packなど
書き込み Hardware Manager Programmer Programmer openFPGALoader、iceprog、ecpprog
シミュレーション Vivado Simulator(xsim) Questa(同梱版) ModelSimまたはQuesta(同梱) Icarus Verilog、Verilator、GHDL、nvc

オープンソース列について補足します。Yosysは多くのファミリー向けに合成を行い、nextpnrはLattice iCE40とECP5、Gowin、その他いくつかのファミリー向けに配置配線を行い、パッカーとプログラマは同じコミュニティによるファミリー固有の小さなツールです。本稿執筆時点で、このフローはLattice iCE40とECP5、Gowin部品では完結しており、一部のAMD 7 Seriesデバイスでは注意点付きで使用可能、現行のAltera部品では存在しません。オープンソースツールチェーンのトピックが最新状況を追っています。

シミュレーションはフローの脇にある

図の中の1つのボックスは主経路上にありません。シミュレーションは、自分で書いた刺激を与えてRTLをソフトウェア上で動かし、合成と配置配線に数分を費やす前にその動作を確認できるようにします。どちらかの段階の後のネットリストを、実際の遅延を付加してシミュレーションすることもできます。設計者として最も多くの時間を費やすのはシミュレーションであり、レッスン06はそれに充てられています。

演習

ベンダーツールを1つダウンロードし、プロジェクトを作らずに開いてみてください。Vivado(無償のML Standardエディション)、Quartus Prime Lite、Radiantのどれでも構いません。オープンソースツールにとどまりたい場合は、YosysHQのOSS CAD Suiteをインストールしてください。Yosys、nextpnr、プログラマが同梱されています。次に、メニューまたはドキュメントの中から、本レッスンの5つの段階それぞれに対応するボタンやコマンドを見つけ、その名前を書き留めてください。これでツールを使う前にその地図が手に入ります。

2つ目の演習として、手元にある開発ボードのFPGAがどのコンフィギュレーション技術を使っているか、ボードにコンフィギュレーションフラッシュが載っているかを調べてください。リファレンスマニュアルに書いてあります。

まとめ

  • フローはRTL、合成、配置配線、ビットストリーム生成、コンフィギュレーションの順に進み、どのベンダーのツールも独自の名前で同じ5段階に従います。
  • 合成はテキストをデバイスプリミティブのネットリストに変換します。配置配線はそれらのプリミティブを物理的な位置に置いて配線し、その過程で制約に対してタイミングを検査します。
  • ビットストリームは、チップ上の設定可能な要素1つにつき1ビットを含むデバイス固有のファイルです。
  • SRAMベースのデバイスは揮発性で、電源投入時にフラッシュまたはプロセッサから読み込みます。フラッシュベースのデバイスは即時起動で書き換え回数に制限があります。アンチヒューズデバイスは一度だけプログラムされ、アップセットが許されない場面で使われます。
  • 制約はフローへの入力です。クロック制約がなければタイミング検査はなく、ピン制約がなければボードとの接続はありません。

さらに読む