hwモジュール生成
+ 組み込みCPUコアとのhw/sw協調設計
ツール
Impulse C
Ver2.1 InterLink InterLink InterLink InterLink 有限会社 インターリンクインターリンクインターリンクインターリンクImpulse Accelerated Technologies 社
' Impulse 社は設立3年の新興ベンチャー
米国ワシントン州シアトル郊外 カークランド市
社長/CTO:David Pellerin
' FPGA開発においても、時代が高度な抽象度の
設計と協調設計手法を要求しているとの確信
から会社設立して Impulse C を開発
' Impulse C :Streams-C
(米国ロスアラモス国立研究所)
の商用化 =>
実績のあるStreams-C 合成コアを大改造 +
シミュレーション機能拡張 + より使いやすく
内容
0. Impulse C とは ~何ができるか?
1. Impulse C 仕様
2. Impulse Cでの動作合成
3. CoDeveloperの構成
4. Impulse C ケース・スタディ
0. Impulse C とは
(
何ができるか?)
Impulse C で何ができるか?
' ANSI-C記述からHDLモジュール生成
' FPGA組み込みプロセッサMicroBlaze、PowerPC を使う
協調アプリケーションの効率的な開発環境を提供
0.ANSI-C to RTL-HDL(VHDL/Verilog) モジュール合成
1.既存ANSI-C開発環境( GNU 、VC++、….)を
hw/sw協調設計開発環境に
2.Xilinxの開発ツールEDK(XPS)との一体化
3.設計IPとXilinxの組み込みIP( hw/sw )を自由に
組み合わせてシステムアップ可能
Impulse Cモジュール と Xilinxツール
1. EDKだけでの使用(裏側でISEも)
' プラットフォームでの設計のみ
' CPU+ペリフェラル
2. EDK+ISE組合せ使用
' プラットフォーム+追加HDLロジック
3. ISE だけでの使用
' Generic HDL 出力の
Impulse C で何ができるか?
Impulse C + Xilinx EDK(
Xilinx Platform Studio)
=>
Xilinx FPGA設計に
「ANSI-C言語での協調設計」
による
SoC
設計 を
Impulse C で何ができるか?
高い抽象度の設計
' hwは高い抽象度の設計
=>
「マイグレーション」が容易で「陳腐化」が防げる
hw<->sw 間のマイグレーションさえ可能
' ソフトウエア設計者のハード設計への参加
Impulse C 適応分野の例
S 高速での繰り返し計算を要求するシステム
S データフロー指向での高度な並行動作
S パイプライン・アルゴリズム(e.g. デジタル・フィルタ)
S データ・ストリームのリアルタイム処理
S 画像処理
S 通信
S 専用DSP(Digital Signal Processing)
~DSPチップのFPGAへの置き換え
Impulse C とは
ANSI-C記述でのhw/sw協調設計を
可能にするライブラリ仕様
=>
Impulse C
設計入力とシミュレーションに
安価なGNU、Microsoftなどのツールが
使用できる
Impulse C とは
Impulse C仕様での
システム開発をサポートする
動作合成を含むツール
=>
CoDeveloper
Impulse C と CoDeveloper は
仕様とツールのペア
Impulse C
と
SystemC
の対比
現在LSI設計が主
主にFPGA組み込み
ターゲット
各種
CoDeveloper
開発システム
C++上で新しい
クラスライブラリ定義
ANSI-C上で新しい
データ型と
組込み関数定義
ハードウェアサポート
のための拡張方法
ISO C++
ANSI-C
言語
SystemC
Impulse C
両者とも新しい言語の導入ではなく
なく
なく
なくソフト開発標準言語上での実装
Impulse C
と
SystemC
の対比
(相違点)
言語:
ANSI-C
Ù
C++
追加仕様:
単純
Ù
複雑
表現能力:
単一のモデル(UTF)
Ù 多岐に渡るモデル
* UTF= Untimed Functional Model
Impulse C/ CoDeveloper と Xilinx
Generic VHDL/Verilog
(Xilinx PSP サポート)
'Generic OPB
'MicroBlaze OPB
'MicroBlaze FSL
'Virtex II PRO PLB(PPC)
'MicroBlaze FSL uClinux
..….
CoDeveloper
ANSI-CXilinx のツール、リソース と CoDeveloper は
良い相性
Impulse C
Impulse C/ CoDeveloper と Xilinx
設計入力(ANSI-C)
シミュレーション
動作合成+IF生成
EDKプロジェクト
Xilinx
Xilinx
Xilinx
アプリケーションの記述
Design Assistant
Design Assistant
Design Assistant
Design Assistantダイアログ
ダイアログ
ダイアログ
ダイアログ
→
→
→
→記述支援
記述支援
記述支援
記述支援
デスクトップ・シミュレーション
シミュレーション
シミュレーション
シミュレーション
シミュレーション
実行
実行
実行
実行ファイル
ファイル
ファイルを
ファイル
を
を
を走行
走行
走行
走行
シミュレーション
シミュレーション
シミュレーション
シミュレーション
が
が
が
が実行
実行
実行される
実行
される
される
される
デスクトップ・シミュレーション
CoDeveloper
Application Monitor
プロセス
プロセス
プロセス
プロセス内
内
内
内の
の
の
の動作
動作
動作
動作を
を
を観測
を
観測
観測
観測
できるようにしている
できるようにしている
できるようにしている
できるようにしている
実装へのファイル生成
動作合成
動作合成
動作合成
動作合成を
を
を実行
を
実行
実行
実行
指定
指定
指定
指定ディレクトリ
ディレクトリ
ディレクトリ下
ディレクトリ
下
下に
下
に
に
に
'ハードウェア
ハードウェア
ハードウェア(
ハードウェア
(
(HDL
(
HDL
HDL)
HDL
)
)
)
'ソフトウェア
ソフトウェア
ソフトウェア(
ソフトウェア
(
(C
(
CC
C)
)
)
)
'ハード
ハード
ハード/
ハード
/
/
/ソフトインタフェース
ソフトインタフェース
ソフトインタフェース
ソフトインタフェース
ファイル
ファイル
ファイル
ファイルが
が
が
が生成
生成
生成
生成される
される
される
される
組み込みプロセッサとして MicroBlaze/ PowerPC
をサポート
S/W
process
H/W
process
H/W
process
S/W
process
H/W
process
H/W
process
H/W process H/W process H/W process H/W process S/W process S/W processMicroBlaze
又は
PowerPC
組み込みプ
ロセッサ
FPGA
ハードウェア
リソース
OPB、FSL、PLB インタフェース
VirtexⅡ / VirtexⅡPro / Spartan
Impulse C
アプリケーション
プロジェクトを作成
CoDeveloper→Xilinx Platform Studio
CoDeveloper
CoDeveloper
CoDeveloper
CoDeveloperの
の
のファイル
の
ファイル
ファイル
ファイル
を
を
を
をXPS
XPS(
XPS
XPS
(
(EDK
(
EDK
EDK)
EDK
)側
)
)
側
側
側で
で
で
で認識
認識
認識
認識
できる
できる
できる
できるディレクトリ
ディレクトリ
ディレクトリ
ディレクトリ構
構
構
構
成
成
成
成にて
にて
にて
にてファイル
ファイル
ファイルを
ファイル
を
を移送
を
移送
移送
移送
「
「
「
「どの
どの
どのファイル
どの
ファイル
ファイル
ファイルをどこへ
をどこへ
をどこへ置
をどこへ
置
置
置けばい
けばい
けばい
けばい
いのか
いのか
いのか
いのか?」
?」
?」
?」などと
などと
などと
などと悩
悩まないで
悩
悩
まないで
まないで
まないで良
良
良い
良
い
い
い
¥ ¥¥ ¥hwhwhwhw¥¥¥¥ハードウェアファイルハードウェアファイルハードウェアファイルハードウェアファイル ¥sw¥¥¥swswsw¥¥¥¥ソフトウェアファイルソフトウェアファイルソフトウェアファイルソフトウェアファイル ¥ ¥¥¥EDKEDKEDKEDK¥¥¥¥EDKEDKEDKEDKファイルファイルファイルファイル
XPSのIPとして認識される
'
CoDeveloper
CoDeveloper
CoDeveloperが
CoDeveloper
が
が生成
が
生成した
生成
生成
した
した
したハードウェア
ハードウェア
ハードウェア
ハードウェア
を
を
を
をAdd/Core
Add/Core
Add/Coreダイヤログ
Add/Core
ダイヤログ
ダイヤログ
ダイヤログの
のリスト
の
の
リスト
リスト
リストに
に
に表示
に
表示
表示
表示
'
CoDeveloper
CoDeveloper
CoDeveloperから
CoDeveloper
から
から移行
から
移行された
移行
移行
された
された
されたソフトウェ
ソフトウェ
ソフトウェ
ソフトウェ
ア
ア
ア
アや
や
や
やインタフェースファイル
インタフェースファイル
インタフェースファイルも
インタフェースファイル
も、
も
も
、
、然
、
然
然
然る
る
る
る
べき
べき
べき
べきディレクトリ
ディレクトリ
ディレクトリ下
ディレクトリ
下
下に
下
に
に
に置
置
置
置かれている
かれている
かれている
かれている
Xilinx
Xilinx
Xilinx
Xilinx Platform Studio
Platform Studio
Platform Studio
Platform Studioの
の
の
の
メニュー
メニュー
メニュー
メニュー[
[[
[Project]
Project]
Project]
Project]
→
→
→
配置配線及び実機確認
基板
基板
基板
基板の
の
の信号観測
の
信号観測
信号観測
信号観測の
の
の為
の
為
為の
為
の
の
の
ターミナルウィンドウ
ターミナルウィンドウ
ターミナルウィンドウ
ターミナルウィンドウ
実機
実機
実機
実機と
と
とデスクトップシミュ
と
デスクトップシミュ
デスクトップシミュ
デスクトップシミュ
レーション
レーション
レーション
レーションとで
とで
とで
とで同
同
同じ
同
じ
じ内容
じ
内容
内容
内容
先
先
先
先の
の
の過程
の
過程
過程で
過程
で
で
で行
行
行
行われた
われた
われた
われた
デスクトップシミュレーション
デスクトップシミュレーション
デスクトップシミュレーション
デスクトップシミュレーション
アプリケーションのソフト側プロセス例
void hear_hello(co_stream hello_in) {int i; int hi = 0; #ifdef IMPULSE_C_TARGET char dataDIPSW = 0; dataDIPSW= XGpio_mGetDataReg(XPAR_DIPSW_BASEADDR,1); XGpio_mSetDataReg(XPAR_LED_BASEADDR, 1, dataDIPSW); #endif
co_stream_open(hello_in, O_RDONLY, INT_TYPE(32)); for ( i = 0; i < 10; i++ ) {
co_stream_read(hello_in, &hi, sizeof(int)); #ifdef IMPULSE_C_TARGET
hi += dataDIPSW;
#else
hi += 10; #endif
printf("FPGA hardware says: %d¥n¥r", hi); } co_stream_close(hello_in); }
「
「「
「設計
設計した
設計
設計
した
した
したハード
ハード
ハード」
ハード
」 側
」」
側
側
側から
から
から送
から
送られて
送
送
られて
られて来
られて
来
来
来た
た
た
たデータ
データと
データ
データ
と
と
と、
、
、
、
LogiCORE GPIO 経由
経由
経由で
経由
で
で
で入力
入力した
入力
入力
した
した外部
した
外部
外部デップスイッチ
外部
デップスイッチ
デップスイッチ
デップスイッチ
の
の
の
の値
値
値
値を
を
を
を演算
演算
演算
演算
3重の「入れ子」構造
rdy eos Process component Top-level application stream en rdy eos data en data stream rdy eos stream Process component signal en data rdytop: xxx_top.v/ xxx_top.vhd
com: xxx_com.v/ xxx_com.vhd
他: xxx_top.v/ xxx_top.vhd を編集して
Impulse C
生成
生成
生成
生成モジュール
モジュール
モジュール
モジュール
Bus接続 ロジック利用形態
利用形態
利用形態
利用形態:
::
:
(
((
(例
例
例)
例
))
)opb_xxx.vhd
組み込み/SOCに使う..….
' 協調設計の効率化
' 処理スピードが仕様を満たさないか
クリチカル部分をハード化
組み込みにしか使えないか?
NO!
NO!
NO!
Impulse C/ CoDeveloper
+
組み込みプロセッサ(MicroBlaze、PowerPC)
=>
In System デバッグ機能
の提供
=>
Impulse Cはどのように
ハードウェアを表現するのか?
ハードウェアのサポートには、
「並列動作」
と
「構造記述の表現」
(ネットリスト)
の
表現ができる仕掛けが必要
Impulse Cのハードウェア化サポート
' 並列動作モデル~
CSP(Communicating Sequential Process)を
元にした判り易いモデルを採用
' 構造記述表現 ~ コンフィギュレーション関数
プロセスと通信要素(チャネル)の
インスタンス化とネットリスト表現
' 仕掛けの実装 ~ ANSI-C上のライブラリとして
この仕掛けを「
Impulse C
」と言う
「並列動作」モデル
S/W process
H/W process
H/W process
S/W process
CSP( Communicating Sequential Process )を元にした判り易いモデル
システムを構成する機能単位
機能単位
機能単位
機能単位(プロセス
プロセス
プロセス)が、並列
プロセス
並列
並列に
並列
に
に
に動作
動作
動作しながら相互にデータを
動作
受け渡し、コントロールをし合って目的の機能を実現する
– データストリームとしてバッファリング通信チャネル(FIFO)を採用~制御付き
– データフロー、機能ユニット間メッセージ交換ベースの通信、ローカル/共有メモリ
のサポート
– プロセスレベルの並列化、パイプライン化(下図)
……
……
……
……
……
Impulse C
' 各プロセスはCの関数=>
アルゴリズム水準
での機能表現
' プロセス間結合~ コンフィギュレーション関数
' プロセス単位でハード/ソフトの指定
' ハード実装では、各プロセスの処理は自動分析されて、
ステートマシンとデータ・パスに明確に分けて合成
S/W process H/W process H/W process H/W process S/W processImpulse C プロセスと4種類の通信チャネル
Software processes
set up data and perform non time-critical functions
Hardware processes are independently
C language
process
C language
process
Shared memory
block reads/writesStream
inputsStream
outputsRegister
inputsRegister
outputsApp Monitor
outputsSignal
inputsSignal
outputsShared memory
reads/writesStream
inputsStream
outputsSignal
inputsSignal
outputsApp Monitor
outputs cosim_logwindow_create () cosim_logwindow_write() cosim_logwindow_fwrite() コンフィギュレーション関数内で cosim_logwindow_init() コア コア コア コア部部部部ANSI-C
記述記述記述記述 コンフィギュレーション関数内で co_stream_create() co_memory_readblock(),comemory_writeblock() co_stream_open(), co_stream_close() co_stream_read(), co_stream_write() co_ssignal_wait(), co_signal_post() コンフィギュレーション関数内で co_signal_create() コンフィギュレーション関数内で co_memory_create()Impulse C
プロセス
通信チャネル(ハード化の場合)1/3
プロセス間のデータ転送、制御のプロトコルを実現する要素S stream (制御付きFIFO)
S 処理スピードの異なる、もしくは一定しない
プロセス間の自動ハンドシェークを実現
S クロックの異なるプロセス・モジュール結合の整合
S FIFOバッファによるバッファリングリング
S 空のFIFOからは読み込めず、ステートマシンはデータが
準備されるまで止まる、満杯への書き込みも同様
en rdy eos dataS signal (ready制御付きレジスタ)
S 入力に「待ち」が必要な場合の「相手のready信号」
を待つ自動ハンドシェークを実現
S 「相手のready信号」がクロック同期で来るまで
ステートマシンは該当ヶ所で止まる
S データの転送だけでなく、同期、排他制御に使用
通信チャネル(ハード化の場合)2/3
プロセス間のデータ転送、制御のプロトコルを実現する要素 signal en data rdyS register (単純なレジスタ)
S クロック毎に有効データが保障されている場合
S 有効性が別手段で確認できる場合
S Register チャネルによるステート・マシンの制御手
段は無い
S 外部IOに使いやすい
通信チャネル(ハード化の場合)3/3
プロセス間のデータ転送、制御のプロトコルを実現する要素 register en dataImpulse C のプロセス
S Cの関数として実装
S 引数のデータ型~通信チャネルデータへのポインタ
co_stream, co_signal, co_memory, co_register
S 特殊引数~コンパイル時パラメータ co_parameter型
VHDLのgeneric値/ Verilog Parameter値
S 戻り値なし
void des_ic(co_stream filter_in, co_stream filter_out) { int32 data;
co_stream_open(filter_in, O_RDONLY, INT_TYPE(32));
co_stream_open(filter_out, O_WRONLY, INT_TYPE(32));
while (co_stream_read(filter_in, &data, sizeof(int32))) {
. . . // Process the data here
co_stream_write(filter_out, &data, sizeof(int32)); }
co_stream_close(filter_in);
co_stream_close(filter_out); }
configulation関数とプロセスの
ポート・マッピング例
stream source_pixeldata 24bit x 4 hw process prep 3x3画素処理の切り出し処理 hw process filter 3x3画素フィルタリング処理 r2 header_ready Pixels_in test_consumer prep_run関数 stream 24bit x 3 filter_run関数 stream result_pixeldata 24bit r0 row2 r1 r2 r1 r0 output_stream input_stream row0 row1 Impulse ImpulseImpulse Impulse C プロセスプロセスプロセスプロセス関数関数関数関数 ImpulseImpulseImpulseImpulseC プロセスプロセスプロセスプロセス関数関数関数関数configulation関数による
プロセスの結合とhw/sw分割
// Create instance of Impulse C software process
cpu_proc = co_process_create("cpu_proc", (co_function)call_fpga,
3, shrmem, startsig, donesig);
// Create instances of Impulse C hardware processes
reader = co_process_create("reader", (co_function)to_stream,
3, startsig, shrmem, istream);
prep_proc = co_process_create("prep", (co_function)prep_run,
4, istream, row0, row1, row2);
filter_proc = co_process_create("filter", (co_function)filter_run,
4, row0, row1, row2, ostream);
writer = co_process_create("writer", (co_function)from_stream,
3, ostream, shrmem, donesig);
// Assign processes to hardware partitions
co_process_config(reader, co_loc, "PE0"); co_process_config(prep_proc, co_loc, "PE0"); co_process_config(filter_proc, co_loc, "PE1"); co_process_config(writer, co_loc, "PE1");
(configulation関数) 'プロセスへの分割
' ソフト/ハードの切り分け 'ハード化はプロセス単位
Shared memory
reads/writesStream
inputsStream
outputsSignal
inputsSignal
outputs cosim_logwindow_create () cosim_logwindow_write() cosim_logwindow_fwrite() コンフィギュレーション関数内で コア コア コア コア部部部は部ははは全全く全全くくく自由自由自由な自由なななANSI-C
記述記述記述記述 コンフィギュレーション関数内で co_stream_create() co_memory_readblock(), comemory_readblock() co_stream_open(), co_stream_close() co_stream_read(), co_stream_write() co_ssignal_wait(), co_signal_post() コンフィギュレーション関数内で co_signal_create() コンフィギュレーション関数内で co_memory_create()Impulse Cの
「ソフト・プロセス」
と
「機能検証段階のハード・プロセス」
Shared memory
reads/writesStream
inputsStream
outputsSignal
inputsSignal
outputsApp Monitor
outputsImpulse Cの
ハード化「可能」プロセス
cosim_logwindow_create () cosim_logwindow_write() cosim_logwindow_fwrite() コンフィギュレーション関数内で cosim_logwindow_init() コンフィギュレーション関数内で co_stream_create() co_memory_readblock(), comemory_readblock() co_stream_open(), co_stream_close() co_stream_read(), co_stream_write() co_ssignal_wait(), co_signal_post() コンフィギュレーション関数内で co_signal_create() コンフィギュレーション関数内で co_memory_create() コア コア コア コア部記述部記述部記述部記述はははは多少制限多少制限多少制限多少制限のあるのあるのあるのあるANSI-C
記述記述記述記述ハード化プロセスへの制約
' 再帰的な表現の禁止
' コンパイル時に確定値を持つポインターのみ
ダイナミック・ポインターの使用禁止
' グローバル変数の使用禁止
' 整数演算、固定少数点演算のみ~
*
固定小数点はマクロでサポート
' 構造体の使用~10月版でサポート予定
2.
Impulse C
の
動作合成
C => HDL
(CoBuilder)
動作合成
デジタル・システム =
データパス
+
コントロール
に分解してRTL-HDL合成
S0 S2 S1 REG ADD MUX コントロール部 データパス部……
Impulse Cハード化プロセス
Impulse Cのモジュール合成
Cソースを制御文と制御文の 間で分割~
Block
化
化
化
化
各Blockを少ないクロックで 処理する~
Stage
化
化
化
化
Impulse Cのモジュール合成
1. 各ステージ(Stage)は、生成ステートマシン(FSM)の
各ステートと1対1の対応
2. 制御構造を抜き出してステートマシン(FSM)となる
3. クロックが入るだけで、C言語ソースの構造を
完全に維持
3種類
の並列化
1. プロセス・レベルの並列化、パイプライン化
~ 設計のCSPモデリングであり
設計の一部->ユーザに委ねられている
2. プロセス内のスケジューリング(ステージ分割)
依存関係の無い処理は一括して1clockで => ステージ化
CoBuilder による
3. ループ内パイプライン化~ステージの並列動作化
CoBuilder による
動作合成コアCoBuilderは2.、 3.の並列化をサポート
Process 内の並列化制御
出力レポート +
スケジューリングのグラフィカル表現
結果の確認
3つのプラグマ
Pipeline、 Unroll、 StageDelay
合成制約
#pragma で指定
1 stage
最適化の対象~ブロック単位(stage分割)
1 clock
Impulse C
のタイミング制御要素
Stage Delay
Stage
Stage
Stage
Stage(
(
(ステージ
(
ステージ
ステージ
ステージ)
)
)
)
Stage = 1clock での処理単位
許されるロジック段数をプラグマStageDelayで調整
S 使用例
#pragma CO set Stage Delay 32
下流工程
下流工程
下流工程
下流工程にむかうにつれ
にむかうにつれ
にむかうにつれ
にむかうにつれ、
、
、
、
論理合成
論理合成
論理合成
論理合成ツール
ツール
ツール
ツールの
の
の
の最適化
最適化
最適化
最適化
処理
処理
処理
処理などによって
などによって
などによって
などによって、
、
、より
、
より
より
より
削減
削減
削減
削減されることもある
されることもある
されることもある
されることもある
StageDelay:
::
:クロック周期と最大遅延の関係の調整
プラグマ UNROLL
sum += A[0];
sum += A[1];
sum += A[2];
sum += A[3];
sum += A[4];
sum += A[5];
sum += A[6];
sum += A[7];
sum += A[8];
sum += A[9];
sum += A_0;
sum += A_1;
sum += A_2;
sum += A_3;
sum += A_4;
sum += A_5;
sum += A_6;
sum += A_7;
sum += A_8;
sum += A_9;
for (i=0; i <10; i++) {
#pragma CO UNROLL
sum += A[i];
}
with
co_par_break()
do {
#pragma CO PIPELINE
co_stream_read(strm_in_samples, &sample, sizeof(DCTELEM));
high = ( sample >> 16 ) & 0xffff ;
low = sample & 0xffff ;
co_par_break();
z1 = IMUL32(low, FIX_0_707106781);
co_par_break();
z2 = IMUL32( z1, z1 );
co_par_break();
z3 = z2 + high ;
z4 = ( z4 & 0x80 ) ? z3 + 0x100 : z3;
co_stream_write(strm_out_dct, &z4, sizeof(DCTELEM));
} while ( ! co_stream_eos(strm_in_samples) );
hw処理速度の理論値 (例)
stream source_pixeldata 24bit hw process prep_proc 3x3画素処理の切り出し処理 hw process filter 3x3画素フィルタリング処理 r2 header_ready Pixels_in test_consumer prep_run関数 stream 24bit x 3 filter_run関数 stream result_pixeldata 24bit r0 row2 r1 r2 r1 r0 output_stream input_stream row0 row1 Impulse ImpulseImpulse Impulse C プロセスプロセスプロセスプロセス関数関数関数関数 ImpulseImpulseImpulseImpulseC プロセスプロセスプロセスプロセス関数関数関数関数Process 内のタイミング制御(CoBuilder出力レポート)
prep_run -Block #6 loop: Stages: 2 (意味)ループ内は2ステージに分割され2clock処理 ---do { p02=B[j]; p12=C[j]; co_stream_read(input_stream,&p22,sizeof(int32)); co_stream_write(r0,&p02,sizeof(int32)); co_stream_write(r1,&p12,sizeof(int32)); co_stream_write(r2,&p22,sizeof(int32)); B[j]=p12; C[j]=p22; j++; } while (j<IMG_WIDTH);Process 内のタイミング制御(CoBuilder出力レポート)
filter_run -Block #1 pipeline: Latency: 8 Rate: 2 (意味) ループ内は8段のパイプラインで 2clock 毎に1結果 ---while (co_stream_read(r0,&data,sizeof(int32)) == co_err_none) { #pragma CO PIPELINE#pragma CO set stageDelay 64
p00=p01; p01=p02; p10=p11; p11=p12; p20=p21; p21=p22; p02=data; co_stream_read(r1,&p12,sizeof(int32)); co_stream_read(r2,&p22,sizeof(int32)); d0=RED(p11)<<3; d0=d0-RED(p00); d0=d0-RED(p10); d0=d0-RED(p12); d0=d0-RED(p20); d0=d0-RED(p21); d0=d0-RED(p22); d0&=(d0>>15)-1; res=d0&0xff; d0=GREEN(p11)<<3; d0=d0-GREEN(p00); ………… d0=d0-GREEN(p22); d0&=(d0>>15)-1; res=(res<<8)|(d0&0xff); d0=BLUE(p11)<<3; d0=d0-BLUE(p00); ………… d0=d0-BLUE(p22); d0&=(d0>>15)-1; res=(res<<8)|(d0&0xff); co_stream_write(output_stream,&res,sizeof(int32));
Process 内のタイミング制御(Stage Master Explorer option)
pixelMag = 0;
CoDeveloper
の構成
Application Manager
S Impulse C設計をサポートするIDE環境
S MinGW(GNU)ベースのANSI-C、Windows設計環境
Application Monitor(
((
(CoMonitor))))
S プロセス動作のモニタリング
CoBuilder
S 動作合成(C to RTL-HDL)
S PSPと一緒になってhw/swインターフェースを生成
Impulse C 基本
基本
基本ライブラリ
基本
Simulation
1. App Monitor ((((CoMonitor))))
Cアルゴリズム水準 DesktopSimulation
* あらゆるANSI-C関連ツールが一緒に使用可能
* プロセス内動作を見る
2. Cycle Acculate Debugger(
Option
)
RTL-HDL -> timed C を得て
cycle accurateな
hw/sw協調検証
3. 合成されたRTL-HDLのHDLシミュレーション
判り易いモデルstream、signal…
テストベンチ作成は容易(多くの例)
Impulse Cによるhw/sw協調設計手順
対象を独立した並行動作をするプロセスに分割
各プロセスをANSI-Cで記述
設計をC言語シミュレーション
設計をターゲット・プラットフォームに最適化
RTL-HDL生成、C言語生成、インターフェース生成
必要に応じて HDL シミュレーション
CoDeveloperを使っての設計
S ソフトもハードも共通のC言語水準での「プロセス」概念で
システムを表現
=> 抽象度の高い水準での設計で効率的
S hw/swインターフェースのためのコード~自動生成
面倒な低水準の設計から開放
S hw/sw協調設計の導入~
十分なhw、swインターフェース検証と
hw、sw分割の最適化
開発効率、実行速度両方の向上
5. Impulse C Case Study
3DES 暗号システム
(Xilinx Microblaze
®platforms)
μClinuxを用いた評価環境
(Xilinx Microblaze
®platform)
Case Study1: 3DES 暗号システム
S パブリックドメインの 3DES ソース・コード使用
S Phil Karn : Qualcomm(
www.ka9q.net
)開発によるコード
S 並行動作向けに開発されたものでなく通常のCPU走行に最適化
S ハード化に
ストリーム・ベースの通信による手法にするための最低限の変更
S データ・ブロックとキーの送受信にストリームの読み込み/書き込みを使用
S 「元のCコードによるCPU走行」と
Impulse C によりハード化した「
専用エンジン」
との
同一データによる比較
S この2つのバージョンが1つのシミュレーション対象になるような
アプリケーション例とする
S ハードにコンパイルして結果を比較
S 元のコードは CPUで、 Impulse C版は専用エンジンで走行
Application Structure (hw Test)
Reference/prototype board
Producer
(random data)
H/W encrypt
S/W encrypt
(legacy C)
Consumer
(compare results
and speed)
Embedded processor FPGA gates “Platform” FPGACompiling 3DES to Hardware
S CoBuilder で VHDL に コンパイル
S 3DES encryption process のみハード化
S Cソース
180
行 から
6500
行 の VHDL コードを生成
S C to RTL コンパイル時間 :
2
分(2.4GHz Pentium, WinXP)
S FPGA vendor tools でVHDL論理合成
S Xilinx ISE (target FPGA: Virtex II )
S 結果の比較を評価ボード上で
S Producer, consumer processes を embedded uP で走行
S 3DES process を FPGA hardware で走行
Results (Virtex
®II FPGA)
S MicroBlaze clock : 100MHz
S 3DES algorithm clock: 24MHz
S Performance (1000 blocks):
S 1block処理のClock cycle数 : 149 (not including I/O
overhead)
S 36X
speedup over software-only version~
チューニング
なし
S
簡単なコードチューニングにより、数100倍以上
6.9 ms*
252 ms
3DES in FPGA
3DES in MicroBlaze
Case Study2:
μClinuxを用いた評価環境
uClinux Image Filter
1. TIFF 画像の元ファイルをFTP 経由でAlbertにPCから ダウンロード 2. TIFF画像を ソフトで処理 (Microblaze) 3. TIFF画像を ハードで処理 (FPGAハード化 エンジン) 4. ソフトとハードの処理速度比較 5. 画像処理後の TIFFファイルをFTP経由で 東京エレクトロンデバイス Virtex-II Pro評価ボード TB-V2P-XSP-016 (Albert)