はじめに
FPGAを使った開発に取り組んでいると、HLS(高位合成)、CSIM、COSIM、といった聞きなれない言葉に出会います
さらに、HLSの結果とOpenCVの結果を比較しているシーンを見て、「なんでソフトウェアとハードウェアで結果を比べてるの?」と疑問に思う方も多いのではないでしょうか
この記事では、そうした疑問に答えるかたちで、高位合成の基本的な考え方と、CSIMやCOSIMの役割、OpenCVとの関係性をわかりやすく解説していきます
高位合成(HLS:High Level Synthesis)とは?
従来、FPGAで何か処理をしたい場合は、VerilogやVHDLといったハードウェア記述言語(HDL) でロジックを1から設計する必要がありました
しかし、それは非常に手間がかかる作業
HLSは、C/C++などの高級言語で記述したアルゴリズムを自動的にハードウェア化してくれる技術です
これにより、ソフトウェアエンジニアでもFPGAの設計に参加しやすくなりました
全体のロードマップ
まずは、HLSを用いたFPGA開発の一般的な流れを俯瞰してみましょう
各ステップの目的と意味
① CSIM(C Simulation)
- 目的: C/C++コードが正しく動くかをソフトウェア上で確認
- 内容: ロジックミスや入出力ミスを検出する
-
実行例:
make run CSIM=1
この段階では、ハードウェアは一切関係ありません
② CSYNTH(C Synthesis)
- 目的: C/C++コードをFPGA向けのRTL(Verilog/VHDL)に変換
- 内容: パイプライン化やリソースの使用量などがここで決まる
-
実行例:
make run CSYNTH=1
出力されるのはFPGAに載せるための回路図的なもの(RTL) です
③ COSIM(Co-Simulation)
- 目的: 合成されたRTLがC/C++の動作と一致しているか確認
- 内容: C/C++とRTLを比較し、差がないかシミュレーション
-
実行例:
make run COSIM=1
ここで差異があれば、CSYNTHの設定やCコードを見直す必要があります
④ VIVADO_SYN(Vivado Synthesis)
- 目的: RTLコードをFPGA向けのネットリストに変換
- 内容: 論理ゲートレベルでの設計を作成
-
実行例:
make run VIVADO_SYN=1
Vivado HLS から Vivado Design Suite にバトンタッチするイメージ
⑤ VIVADO_IMPL(Vivado Implementation)
- 目的: 実際のFPGA上のリソースに配置・配線
- 内容: クロック制約・タイミング制約の検証もここ
-
実行例:
make run VIVADO_IMPL=1
ここまで完了すれば、FPGAに書き込めるbitstreamが生成されます!
ゴール:実機での動作確認
最終目標は、生成されたbitstreamを使ってFPGAに実装し、外部入力に応じて意図した処理ができるかどうかを検証することです
たとえばカメラ画像に対してフィルタ処理を行う場合、
- OpenCV:ソフトウェアでの「正しい」結果
- FPGA出力:ハードウェア実装の実際の出力
この2つを比較することで、FPGAが想定通りに動作しているかが確認できます
OpenCVの結果と比較する理由
- OpenCVで出力された画像は、“期待される理論値” として扱えます
- HLSやFPGAから出力された画像と比べることで、数値の誤差や設計ミスを検出できる からです
ソフトウェア(OpenCV) = テストの正解例
ハードウェア(HLS, FPGA)= 作った回答
この2つを比較することで、FPGAが想定通りに動作しているかが確認できます
ここで重要なのは、ソフトウェア(OpenCV)とハードウェア(HLS/FPGA)で出力結果が完全に一致しないこともあるという点です
これは、以下のような理由から発生します
-
ハードウェア合成時に固定小数点演算へ変換され、丸め誤差が生じる
-
パイプライン処理や並列化による処理順序の違い
-
メモリアクセスや境界処理の違い(たとえば画像端の扱い)
このような背景があるため、HLS開発では “許容誤差の範囲で一致しているか” を確認することが大切です
まとめ
ステップ | 内容 | 目的 |
---|---|---|
CSIM | Cシミュレーション | ロジックバグの早期発見 |
CSYNTH | 高位合成(C→RTL変換) | RTLの生成、性能見積もり |
COSIM | 協調シミュレーション | 合成RTLとCの結果の一致確認 |
VIVADO_SYN | 論理合成(ネットリスト) | FPGA向けの論理回路作成 |
VIVADO_IMPL | 配置配線 | FPGAリソースに割り当て、タイミング調整 |
実機実装 | FPGA書き込み | 実環境での動作確認 |
おわりに
開発の最初から実機動作までには、複数のチェックポイントが存在することが分かりました
それぞれのステップでの検証が、後戻りコストを減らし、高信頼なFPGA設計につながります
※ 本稿は以下のサイトを参考にしています
https://xilinx.github.io/xup_high_level_synthesis_design_flow/Lab4.html