Xilinx社の新開発環境「SDSoC」について

1.SDSoC開発環境の紹介とISPの期待

1.1.はじめに

ISPでは「高速化技術」への取り組みの一環として、「高位合成」によるSWアルゴリズムのHW(FPGA)化を進めています。
具体的な取り組みとしては、その第1弾「FPGA開発による、画像処理高速化モデル」でお伝えしたとおり、C/C++で記述された弊社の画像処理アルゴリズムを「高位合成」によりカスタムIP化し、HW(FPGA)で動作させるという取り組みです。

ISPでの取り組みに呼応するかのように、最近のIT関連のニュースでもHW/SW一体での高性能・高効率システムの開発事例が話題に上り、FPGAが高速化技術のトレンドとして改めて認知されているのを感じています。

このような状況の中、今年の3/10にXilinx社が満を持して新しい開発環境「SDSoC」を発表しました。

今回、Xilinx社のご厚意を受け、ISPでもこの「SDSoC」をいち早く試用する機会を得ましたのでまずはこの開発環境のご紹介と、これに対するISPの期待を書きたいと思います。

1.2.新しい開発環境「SDSoC」とは?

Xilinx社の紹介を引用すると、SDSoCの特徴は以下の通りです。

SDSoC開発環境は非常にシンプルなASSP同様のC/C++プログラミング環境を提供します。使いやすいEclipse IDEを含み、ヘテロジニアスなZynq All Programmable SoCおよびMPSoCのための包括的な開発環境を提供します。
業界初、フルシステムの最適化をC/C++のみで実現するコンパイラを備えたSDSoCは、システムレベルのプロファイリング、プログラマブルロジックを利用したソフトウェアアクセラレーションの自動化、システムレベルコネクティビティの自動生成、およびプログラミングを迅速に行うためのライブラリを提供します。

 引用元:Xilinx社website, SDSoC 開発環境

実はこの数行に、SDSoC主な特徴が全て込められています。と言っても、SW技術者的には専門用語が多くてなかなかピンとこないですね……。

そこで、ちょっと回り道ですがISPでの開発経験を踏まえて、これまでの「Zynqプラットフォームを対象とした開発(以下、Zynq開発)」のフローとそこで起こりがちな問題を説明します。

1.3.これまでの「Zynq」開発と起こりがちな問題

「FPGA開発による、画像処理高速化モデル」でも触れていますが、ISPではXilinx社の「Zynq」を対象にHW化を進めています。
この「Zynq」はXilinx社がAll Programmable SoCと銘打つ、ARM 社のデュアルコアCPU(Cortex-A9)とFPGAを1つのチップに搭載したSoC(System on Chip)です。
開発対象として「Zynq」を使うメリットとしては、主に以下の事柄が考えられます。

  • HW化したいアルゴリズムを、あらかじめCPUコア上でSWとして動作させられるためアルゴリズムの検証が容易
  • FPGAとCPUが一体のため、HW設計時にFPGAとCPUの接続に悩む必要がない。
  • 組込み向けのメジャーなOSやソフトウェアライブラリがサポートされている。
  • 浮動小数点の計算などFPGAでは効率の悪い処理を、強力なARMコアで処理するなどCPUとFPGAの協調動作がしやすい。

そして、SW(C/C++)で実装されたアルゴリズムを「Zynq」向けにHW化も含めて移植する場合、以下のような手順になっていました。

Step 1 (準備) HW化対象のアルゴリズムを動作させるためのターゲットシステムを設計する。一般的には「Zynq」搭載の評価ボードを用い、必要な周辺回路(例えば、カメラ入力/画面出力回路)を設計する。
Step 2 SWとして実装されたアルゴリズムの中から、HW化する処理部分を抽出する。あわせて、そのHWとSWの間のI/F設計も行う。
Step 3 HW化する処理を「高位合成」するために、Vivado HLSのC/C++で実装する。このとき、HW化後の挙動を適切なものにするためのディレクティブも考慮する。
Step 4 HW化する処理を全て「高位合成」によってカスタムIP化し、アルゴリズム部分のシミュレーションおよびデバッグを行う。
Step 5 各カスタムIPの検証できたところで、Vivado IP Integratorを用いて、FPGA内部を設計する。設計のチェック後、合成・配置配線およびビットストリーム生成を行う。また、タイミング等の制約が満たされていることを確認する。
Step 6 SDKを用いて、ブートローダ、BSP、アプリケーションSWの作成を行い、システムテストを行う。

つまり、開発の対象とするシステムをHW単位の部品に切り分け、その各部品を (高位合成で) 製造し、もう一度システムを組み立て、最後に制御SWを作成するという流れです。
このように細部から全体へ向かう組み立てプロセスを「ボトムアップ型」としましょう。
このようなボトムアップ型の設計・製造工程は、普段ソフトウェア開発を行っている我々にはイマイチ馴染みません。なぜならば、ソフトウェアでのシステム開発では、システムの全体から詳細へ設計を進める「トップダウン型」のプロセスがほとんどだからです。
実際、画像処理高速化を行った際にも以下のような手戻りが発生しました。

  • HW化の対象を決め、処理単位に分割を行ったが、実際に高位合成してみるとリソースの消費率や動作タイミングに問題があることが分かり、処理単位の分割から見直した(Step2~Step3の繰り返し)
  • 各IPを作成し、回路全体の合成・配置配線も完了したがタイミング制約を満たさなかった。(Step1~Step4の繰り返し)

また、一般的にSW/HWが協調動作するシステムでのパフォーマンス最適化を考える場合などに「HW化する処理」をどのように決めるか?が問題になってきます。従来の「ボトムアップ型」開発フローでは「HW化する処理」の変更は即ち全工程をやり直すことになってしまいます。

1.4.「SDSoC開発環境」での開発と期待できること

今回発表された「SDSoC開発環境」の最大のねらいは、可能な限り「ボトムアップ型」開発フローをやめ、SWによるシステム開発と同様に、「トップダウン型」のフローでZynq開発が行えるようにすることと考えます。

実際、SDSoCのlook&feelはVivado HLSやSDKと同様に「Eclipse IDEのC/C++プログラミング環境」といった風情です。ではこれでどのようにZynq開発を行うのか?Xilinx社の提唱する開発フローは以下のとおりです。

Step A ターゲットシステム上で動作させたいアプリケーションをZynqのCPUで動作するSWとして記述します。このときはまだ、ZynqのFPGA部分を意識する必要はありません。
Step B SWで実装したアプリケーションからHW化する部分を決定します。このときSDSoCのもつシステムレベルのプロファイリングツールを用いることで、SWとして動作させた場合のボトルネックやHW化した場合のシステムパフォーマンスなどを簡単にチェックすることができます。
Step C HW化する部分を決定したら、SDSoCのプロジェクト上でHW化する処理(関数)を選択・決定し、ビルドを行います。このとき、SDSoCの内部では以下の処理が自動的に行われます。

  • HW化する処理に対するHLSのコンパイラでのIP化
  • 作成されたIPのVivadoによる読み込みと、システムレベルコネクティビティの自動生成
  • 生成された回路を用いたプログラミングのためのライブラリ生成
  • SW処理に対するクロスコンパイルと生成されたライブラリとのリンク

いかがでしょうか?
SDSoCを用いた開発では、従来の開発フローの中にあった「HLSによるIP化(Step 3)」と「Vivadoによる回路全体の生成(Step 4)」が自動化されていることが分かります。そして、従来の開発フローでは最後(Step 5)に行われていたアプリケーションSW作成が、SDSoCでは一番最初になっており、人が行う作業のフローとしては、まさに「アプリケーションSW開発」そのものというわけです。さらにこの新しい作業フローと、SDSoCで提供されるシステムレベルのプロファイリングツールを組み合わせることで、HW化する処理を決める際のリスクを事前にかなり低減することが出来るようになります。

SDSoC

Xilinx社もSDSoC開発環境をリリースした背景を以下のように語っています。

ハードウェア関連のリソースを持たない、あるいはリソースが限られているチームには、デバイスの利点を十分に活用するため必要な RTL (VHDL または Verilog) 開発技術の不足という点で不利が生じていました。こうした不利を解消し、より多くのデザインチームが Zynq デバイスを活用できるようにするため、ザイリンクスは新たな C/C++ 開発環境として SDSoC 開発環境を発表しました。

 引用元:SDSoC 開発環境の背景説明 (日本語版)[PDF資料]

「ハードウェア関連のリソースが限られている」というかほぼゼロのISPにとってSDSoCはうってつけのツールというわけですね。

ISPでは最新の開発環境を積極的に取り入れながら、引き続きZynq/FPGAを用いた「高速化技術」の確立を進めていきます。