Contenu connexe
Similaire à ソフトウェア志向の組込みシステム協調設計環境 (20)
Plus de Hideki Takase (20)
ソフトウェア志向の組込みシステム協調設計環境
- 2. 講演内容
• はじめに
• プログラマブルSoCのための協調設計環境
− システム設計・合成フローとSW志向の入力記述
− SW/HW切分けと通信インタフェース
− 組込みリアルタイムシステム設計への対応
− ツールチェーン実装と設計空間探索への適用
• コンフィギュラブルLSIのための協調設計環境
− SW志向設計の方針と設計記述モデル
− 合成フローとメリット
− 現在の開発状況と適用事例
• まとめと今後の展望
2
- 7. FPGAとは?
• Field Programmable Gate Array
− 中身を改変可能なLSI
− ハードウェアそのものの
振る舞いを変えられる
− 独自のデジタル回路を
自由に何回でも形成できる
− FPGA二大ベンダ:
Xilinx・Altera (powered by Intel)
7
IOB
SB
CB LB
IOB
IOB
SB
IOB LB
SB
CB CB
SB
CB
SB SB
CB CBLB IOBIOB LB
SB SB SB
IOB IOB
CB
CB
CB
CB
CB
CB
入出力ブロック
コネクションブロックLB 論理ブロック
IOBSB スイッチブロック
CB
LUT
IN OUT
0000 1
0001 0
0010 0
… …
1110 1
1111 0
D-FF
D Q
- 9. FPGAの用途
• ASICの設計・検証用LSIに活用
− ASICの機能を製造前に検証できる
− HWの完成前からSWの開発が始められる
• 最終製品に組み込むLSIに活用
− 民生品での実用例はすでにキリが無いほど多い
− 出荷後のデータ書き換え機能を持たせることも
• 最近の実用例
− 金融市場取引
− ロボット
− データセンター
− 機械学習
− オートモーティブ(ADAS)
9出典:井上, 情報処理学会誌, 2012. K. Ovtcharov, et al., HotChips27, 2015.
http://phenoxlab.com http://techon.nikkeibp.co.jp/atcl/news/16/062702771/
- 11. 通
信
バ
ス
従来の協調設計
11
プロセッサ FPGA
HW
HW
SW
SW
アナログ回路
driver
SW
int_t main () {
a = func1(xxx);
b = func2(yyy);
c = a + b;
}
int_t func1(x) {
…
return val;
}
int_t func2(y) {
…
z = func3(y);
...
return val;
}
always@(posedge CLK) begin
if (!RES) XOUT <= 0;
else begin
case (IN)
4'b0001 : TMP <= 1;
4'b0010 : TMP <= 5;
4'b1100 : TMP <= 7;
default : TMP <= 0;
endcase
end
end
assign OUT = ~{REG[7:4],
ソフトは
書けるかな,,,
ハードも
書くの!?
データ通信は
どう設計しよう?
どれをどこで
処理するの??
ドライバは
どう使うの?
- 15. 対象とするデバイス
• Xilinx社 Zynq-7000 All Programmable SoC
15
PS(プロセッシングシステム)
・ARM Cortex A9デュアルコア
・キャッシュ
・メインメモリ
・ペリフェラル
・…
PL(プログラマブルロジック)
・構成可能論理ブロック
・ディジタル信号処理ブロック
・ブロックメモリ
・…
ARM AMBA AXI:PSとPLを接続
ポート マスタ ポート数 用途
GP-AXI PS/PL 2/2 汎用
AXI-HP PL 4 メモリアクセス
AXI-ACP PL 1 キャッシュアクセス
プロトコル バースト転送 特徴
AXI4-Lite 不可 省リソース
AXI4 256回まで 大量データ向き
AXI4-Stream 無制限 ストリーミング特化
- 16. 通
信
バ
ス
プログラマブルSoCにおける設計
16
プロセッサ FPGA
HW
HW
SW
SW
int_t main () {
a = func1(xxx);
b = func2(yyy);
c = a + b;
}
int_t func1(x) {
…
return val;
}
int_t func2(y) {
…
z = func3(y);
...
return val;
}
always@(posedge CLK) begin
if (!RES) XOUT <= 0;
else begin
case (IN)
4'b0001 : TMP <= 1;
4'b0010 : TMP <= 5;
4'b1100 : TMP <= 7;
default : TMP <= 0;
endcase
end
end
assign OUT = ~{REG[7:4],
ソフトは
書けるかな,,,
ハードも
書くの!?
データ通信は
どう設計しよう?
どれをどこで
処理するの??
- 19. SWORDSの入力0
19
コ
ン
パ
イ
ル
HWタスク
HDL
HW
モジュール
SW
モジュール
資源情報
cfg
カーネルコード
ラッパータスク
C
SWタスク
IF情報付C
サービス
コール情報
SWタスク
C
cfgファイル
論
理
合
成
IF
合
成
タ
ス
ク
切
分
け
・
生
成
高
位
合
成
SW-IF情報
HWタスク
IF情報付C
設計記述
C
構成記述
JSON
{
“software_tasks": [
{"name": “main”},
{"name": “func1”} ] ,
"hardware_tasks": [{
"name": ”func2",
"mode": "s_axilite",
"arguments": [{
"name": ”b",
"mode": "m_axi",
"bundle": "bundle_a",
"offset": "slave",
"direction": "in"
},{
"name": ”c",
"mode": "m_axi",
"bundle": "bundle_a",
"offset": "slave",
"direction": "in"
},{
"name": ”y",
"mode": "s_axilite",
"bundle": "bundle_b",
"direction": "out"
}],
"bundles": [{
"bundle": "bundle_a“,
"port": “ACP"
},{
"bundle": "bundle_b“,
"port": “GP0"
}}],
int_t main () {
func1(a, x);
func2(b, c, y);
z = x + y;
}
void func1(a, x) {
… = a;
x = ... ;
}
void func2(b, c, y) {
... = b
z = func3(c);
y = z + ...;
}
C言語だけで
システム設計を記述
SW実行する
関数を指定
HW実行する関数と
制御用プロトコルを
指定
引数毎に,
通信バンドルと
通信用プロトコル,
入出力方向を指定
通信バンドルを
接続するポートを
指定タスク・セマフォ等の
カーネル資源情報を記述
- 25. サポートするサービスコール
25
分類 サービスコール 機能
タスク管理機能 act_tsk 他タスクを起動する
ext_tsk 自タスクを終了する
タスク付属同期機能 slp_tsk 自タスクを起床待ちに
wup_tsk 他タスクを起床させる
dly_tsk 自タスクを遅延させる
同期・通信機能 wai_sem セマフォを獲得する
sig_sem セマフォを返却する
時間管理機能 get_utm システム時刻を取得する
- 28. ツールチェーン実装
• 使用ツール(全て無償で入手可能)
• 実行方法(Windows cmd.exe上で動作)
$ swords.bat desing_file config_file [llvm-libfile]
28
ツール バージョン 用途
python 2.7.1
SW/HWタスク切分け・生成,
IF合成,各tclファイルの生成
clang 3.4以降 設計記述の解析
Vivado HLS 2015.4 HWタスクの高位合成
Vivado 2015.4 HWモジュールの論理合成
Xilinx SDK 2015.4 SWバイナリのコンパイル
github.com/tlk-emb/SWORDS
- 30. 設計空間探索への適用
• 適用対象:一辺32の行列積演算
− 引数毎の通信方式:3*3種類
GP + AXI4-Liteプロトコル
ACP + AXI4プロトコル
ACP + AXI4プロトコル,
バッファ変数にARRAY_PARTITION指示子を適用
− ループパイプライン化の選択:21種類
パイプライン化しない
内側のループに適用,
パイプライン間隔1~10
中間のループに適用,
パイプライン間隔16~25
− 合計567通り (3*3*3*21)
30
- 34. 通
信
バ
ス
再掲:従来の協調設計
34
プロセッサ FPGA
HW
HW
SW
SW
アナログ回路
driver
SW
int_t main () {
a = func1(xxx);
b = func2(yyy);
c = a + b;
}
int_t func1(x) {
…
return val;
}
int_t func2(y) {
…
z = func3(y);
...
return val;
}
always@(posedge CLK) begin
if (!RES) XOUT <= 0;
else begin
case (IN)
4'b0001 : TMP <= 1;
4'b0010 : TMP <= 5;
4'b1100 : TMP <= 7;
default : TMP <= 0;
endcase
end
end
assign OUT = ~{REG[7:4],
ソフトは
書けるかな,,,
ハードも
書くの!?
データ通信は
どう設計しよう?
どれをどこで
処理するの??
ドライバは
どう使うの?
- 38. 設計記述モデル
• 部品関数
− コンポーネント部品を表現する
− 引数と返値によって,部品構成の
選択や入出力端子の接続を記述する
返値を持たないもの,
複数の接続ができるものもある
• ピン変数
− ボード上のピンまたはマイコンの
GPIOを表現する変数
− 入出力は区別しない(両用は不可)
• ネット変数
− 部品間/ピン間の接続を表現する
一時変数
38
#include “swordslib.h”
void setup(){
/* システムクロックの設定 */
swords_system(“HIGH”, “1”, “HIGH”);
/* 8bit Ref. DACの出⼒レベルの設定と接続 */
net1 = swords_refdac0(“200”);
IO1D = net1;
/* 12bit R2R DACの出⼒波形との設定と接続 */
net2 = swords_r2rdac(“LUT”, “6000”, “SIN”);
IO1A = net2;
/* コンパレータの⼊出⼒端⼦の接続 */
IO4A = swords_comp(net1,net2);
/* 12bit 逐次ADCの出⼒端⼦の設定と接続 */
net3 = IO1C;
swords_saradc(net3);
/* DIO1AをGPIOとして使⽤ */
swords_enable_GPIOB(DIO1A);
}
void loop() {
/* ADCの出⼒値の取得 */
adcdata = IO1C;
/* Ref. DACへの⼊⼒値の設定 */
IO1D = adcdata>>4;
/* 100msの遅延 */
swords_delay(100);
/* DIO1Aの値反転 */
blink = (blink ? false: true);
DIO1A = blink;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- 39. 設計記述モデル
• setup():
− 部品関数による設定と接続の記述
引数:構成設定,入力端子の接続
返値:出力端子の接続
− ピン変数・ネット変数:
部品間・ピン間の接続
• loop():
− アプリ動作の記述
ピン変数を介して,部品関数への
値設定/取得,ピン間の値送受
− main()から繰り返し実行される
繰り返しの遅延も記述できる
39
#include “swordslib.h”
void setup(){
/* システムクロックの設定 */
swords_system(“HIGH”, “1”, “HIGH”);
/* 8bit Ref. DACの出⼒レベルの設定と接続 */
net1 = swords_refdac0(“200”);
IO1D = net1;
/* 12bit R2R DACの出⼒波形との設定と接続 */
net2 = swords_r2rdac(“LUT”, “6000”, “SIN”);
IO1A = net2;
/* コンパレータの⼊出⼒端⼦の接続 */
IO4A = swords_comp(net1,net2);
/* 12bit 逐次ADCの出⼒端⼦の設定と接続 */
net3 = IO1C;
swords_saradc(net3);
/* DIO1AをGPIOとして使⽤ */
swords_enable_GPIOB(DIO1A);
}
void loop() {
/* ADCの出⼒値の取得 */
adcdata = IO1C;
/* Ref. DACへの⼊⼒値の設定 */
IO1D = adcdata>>4;
/* 100msの遅延 */
swords_delay(100);
/* DIO1Aの値反転 */
blink = (blink ? false: true);
DIO1A = blink;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- 42. 現在の開発状況
• 使用ツール
− python 2.7以上
pythonライブラリ:jsonschema, clang
− clang 3.4以上
• 実行方法(Windows cmd.exe上で動作)
$ swords4RM.py [-h] --gen-mode {json,xml,loop}
[--logging {debug,info,warning,error,critical}]
[--llvm-libdir LLVM_LIBDIR] [--llvm-libfile LLVM_LIBFILE]
design_file config_file
− json: 各回路の構成記述の生成
− xml: 回路情報(回路構成情報,接続情報)の生成
− loop: SWフレームおよびアプリ記述の生成
42
Notes de l'éditeur
- 凄く乱暴な定義をすれば,汎用コンピュータ以外の専用コンピュータ
- FPGAは基本論理セルが規則的に並ぶ構造となっています.
セルの組み合わせと接続を変えることで,ある時は通信回路,動画処理エンジン,暗号回路,プロセッサにもなれる.
ドワンゴさんのサーバでも動いているらしいです.
設計方法,プログラミングというとちょっと語弊がありますが,こんな言語で記述します.ぶっちゃけ私はこんなの書けないです.
最近ではそんな私のために,高位合成という技術が実用レベルになりつつあります.
- FPGAは基本論理セルが規則的に並ぶ構造となっています.
セルの組み合わせと接続を変えることで,ある時は通信回路,動画処理エンジン,暗号回路,プロセッサにもなれる.
ドワンゴさんのサーバでも動いているらしいです.
設計方法,プログラミングというとちょっと語弊がありますが,こんな言語で記述します.ぶっちゃけ私はこんなの書けないです.
最近ではそんな私のために,高位合成という技術が実用レベルになりつつあります.
- LB:論理回路を実現する論理要素
IOB:外部との信号の入出力を行う要素
SW, CB, Wire:それらを接続する配線要素
- 民生品はもちろん多いけども
ネットワーク機器とか画像エンジンとか
- 協調設計:SWとHWの設計を連携させながら同時並行的に進める
- HDL書きたくない IF作りたくない
現在はZynqを対象に開発中
打倒SDSoC??SDSoCと仲良くなるツール
- ここまで10分でいけるか?
- さっさと入力の説明
- 構成情報の仕様の定義を行います.
SWエンジニアが容易に記述可能なように,JSON形式を採用します.
構成情報の内容では,SW/HWで実行するタスク,HWタスクの引数のインタフェースを簡潔に指定できるようにします.
現状の実装では,1つのHWタスクのみの構成に対応しています.
- Stream通信も可能
- リアルタイムシステム設計にFPGAの恩恵を活かすことができる
既存資産のリアルタイムシステム設計を流用することも可能
HWタスク⇔SWタスクの双方向でサービスコール発行可能
- HWタスクとラッパータスクの実行状態を同期させる
ラッパータスクはビジーウェイトする
全てSWタスクとした場合と処理順序が等しい
HWタスクは中断できない
優先度逆転時の対処は設計者に任せる
並列実行
SWタスクとHWタスクを並列実行させる
起床待ちと割込みの利用によって実現
逐次実行よりも高速化が期待できる
処理順序が優先度通りにならないことがある
- 引数1つにつき3種類の選択肢とする:引数は3個
- CPUは30MHz,FPGAは1152LUT/20Kgates
CypressのPSoCもこんな感じ
- 協調設計:SWとHWの設計を連携させながら同時並行的に進める
- シャープ測距モジュール GP2Y0E02A (アナログ出力)
超音波センサ(送受信セット)[UR1612MPR/UT1612MPR]