SlideShare une entreprise Scribd logo
1  sur  81
Télécharger pour lire hors ligne
第391回 PTT 2013. 6. 28
JavaRockの実装と設計,
そして,次へのステップ
三好 健文
株式会社イーツリーズ・ジャパン
1
第391回 PTT 2013. 6. 28
.java%
Java %
.vhdl%
Java %
/
JavaRock%
JVM%
JavaRockとは
2
JavaRockの目指すところ
JavaプログラムをそのままHDLに変換→FPGA上のHWにする
追加構文,データ型は導入しない
記述に制限は加える
HDLで書けることをJavaで書けるようにする ではない
Javaで書けることを全部HDLにする ではない
http://javarock.sourceforge.net/
テキスト
第391回 PTT 2013. 6. 28
今日の流れ
FPGAと高位合成処理系について
JavaRockの実装と設計
JavaRock2の計画
3
第391回 PTT 2013. 6. 28
FPGAとは
4
論理回路・データパスを自由に作り込める
クロックレベルの同期と並列性の活用
Field Programmable Gate Array
HDLがドレスを着たお姫さまだとすると,コンパイル時
にエラーをしっかり検出してくれるが故にコンパイルを通
すのが困難な反面,コンパイルさえ通れば合成した回路が
きちんと動作してくれるBluespecはパワフルなツンデレ
娘と筆者はイメージしています(図2).
 Verilog HDLやVHDLを使った設計で,
― あぁ∼,数字って32ビットだった.うっかりキャスト
されていたよ…
― テスト・ベンチのステート・マシンを書くのが面倒だな.
― モジュールのインスタンシーエーションで入出力ピン
をつなぎ忘れていた
という思いをしたことはありませんか?
 単純な記述の羅列や細かいミスへの注力が続くと,本来
力を入れるべき,アーキテクチャの設計まで億劫になって
しまいます.また,「コンパイル(論理合成)は通るのに,
シミュレーションやFPGA上で動作させると,何かおか
しい」という事態に頭を悩ませ,原因はうっかりミスだっ
たということも一度や二度ではないと思います.
 記述の手間がもっと省けて,コンパイル時に強力にエ
ラー・チェックしてくれるHDL言語ないかなあ…という
要求に応えてくれるのがBluespec System Verilogです
(図1).VHDLがまじめなキャリア・ウーマン,Verilog ▲ 図2 Bluespec System Verilogは ツ
ンデレ娘
きっちりしていてキャリアも長いVHDL,あいま
新世代のESL合成ソリューション
Bluespec System Verilogのすすめ
 本章では,高位設計言語であるBluespec System Verilogを紹介する.こ
の言語では,コンパイル時にしっかりエラー検出ができ,また,さまざまなライブ
ラリも提供している.FPGAやASICが大規模化し複雑な回路を設計する機会が
増えてきた今,知っておくべき技術だろう. (編集部) 三好 健文
出典: CQ出版 Interface 2011年2月号より
第391回 PTT 2013. 6. 28
FPGAの活用シーン
5
独自の回路を実現できるハードウェア
特定の処理を低消費電力で高性能処理
デバイスに近い処理を簡単に実現
自由なI/Oポートの定義
ASIC開発のプロトタイプとして
特定用途向け少数生産の製品として
第391回 PTT 2013. 6. 28
例) freeocean
6
最大スループット: 1Gbps
最大同時処理コネクション数: 50万
秒間同時接続数: 約2万HTTPリクエスト
最大消費電力: 300W以下
ハードウェアWebキャッシュサーバ
第391回 PTT 2013. 6. 28
演算リソースとしてのFPGAの魅力
7
http://www.altera.com/literature/wp/wp-01142-teraflops.pdf
Smith-Waterman 法による多重配列アライメン ト処理とモンテカルロ法
ベースの金融シミュレーショ ンを FPGA で実行した場合,それぞれ CPU
に比べ て 228 倍と 545 倍高速に処理できた
[ 1 ] Reconfigurable Computing in the Multi-Core Era.
In Internal Workshop on Highly-Efficient Accelerators
and Reconfigurable Technologies, 2010.
< 1.25 TFLOPS, 10∼12GFLOPS/W
CPUと比べて高い処理能力
数値計算性能
内蔵DSPを活用して...
第391回 PTT 2013. 6. 28
FPGAの応用事例
8
1) http://www.thenewstribe.com/2012/11/01/infotech-becomes-pakistans-first-netezza-certified-ibm-partner/
2) http://techon.nikkeibp.co.jp/article/NEWS/20110502/191552/
1)
2)
DB,金融,油田探索
第391回 PTT 2013. 6. 28
FPGAアプリケーションの研究事例
9
A Fully Pipelined FPGA Architecture for Stochastic Simulation of Chemical
Systems
A Hardware Accelerated Approach for Imaging Flow Cytometry
Accelerating Solvers for Global Atmospheric Equations though Mixed-Precision
Data Flow Engine
An FPGA Based Parallel Architecture For Music Melody Matching
An FPGA Memcached Appliance
High Throughput and Programmable Online Traffic Classifier on FPGA
Join Operation for Relational Databases
A Packet Classifier using LUT cascades Based on EVMDDs(k)
Memory Efficient IP Lookup in 100Gbps Networks
A Flexible Hash Table Design for 10GBps Key-Value Stores in FPGAs
A Secure Copreocessor for Database Applications
Fast, FPGA-based Rainbow Table Creation for Attacking Encrypted Mobile
Communications .....
30+
@FPGA2013, FPL2013, FCCM2013
第391回 PTT 2013. 6. 28
FPGA上のプログラミングとは
10
論理回路構成要素の演算内容を決める
論理回路構成要素同士をどう接続するかを決める
cf. http://commons.wikimedia.org/wiki/File:Two_women_operating_ENIAC_(full_resolution).jpg
第391回 PTT 2013. 6. 28
FPGA上のプログラミングとは
11
2) http://hitechglobal.com/boards/virtex7_v2000t.htm
3) http://http://low-powerdesign.com/sleibson/2011/10/25/generation-jumping-2-5d-xilinx-
virtex-7-2000t-fpga-delivers-1954560-logic-cells-consumes-only-20w/
1) http://japan.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf
1)
2)
3)
第391回 PTT 2013. 6. 28
FPGAの開発手法の主役
12
HDL(Hardware Description Language)
によるRTL(Register Transfer Level)設計
+
>
a
b
x
y
f
g
h
counter+1
clk
第391回 PTT 2013. 6. 28
HDLによる設計のメリット/デメリット
13
ロジックを抽象化した式/構文で設計できる
クロックレベルのデータ制御
細粒度の並列性の活用
状態 を自分で管理しなければいけない
デバッグ/動作検証が難しい
アルゴリズムを設計するには記述が煩雑
メリット
デメリット
第391回 PTT 2013. 6. 28
HDLによる設計のデメリットを克服する方法
14
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
第391回 PTT 2013. 6. 28
HDLによる設計のデメリットを克服する方法
15
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
環境/ソース保守コストの増大
第391回 PTT 2013. 6. 28
HDLによる設計のデメリットを克服する方法
16
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
第391回 PTT 2013. 6. 28
高位合成言語/処理系に何を求めるか
記述コストの軽減
高い抽象度の表現方法を利用したい
言語習得のコストは低く抑えたい
動作検証/デバッグコストの軽減
短時間で動作を確認したい
見通しよく手軽なデバッグをしたい
FPGAのパフォーマンスの活用
粗粒度,細粒度の並列性を活用したい
IPコア,FPGA内蔵機能を活用したい
17
第391回 PTT 2013. 6. 28
沢山の高位合成言語/処理系
18
Vol. 29 No. 1 Feb. 2012 81
表 1 ベース言語別に分類した高位合成言語の例
ベースの言語 言語名
C BACH-C[5],Handel-C[6],DeepC Compiler[7],PICASSO[8],COBRA-ABS[9],
DEFACTO Compiler[10],Streams-C[11],GARP C Compiler[12],SA-C[13],
Impulse-C[14],SpecC[15],GorillaC[16]
C++ SystemC[17],OCAPI[18],HP-Machine[19]
Java Galadriel/Nenya[20],JHDL[21],Lime[22],MaxCompiler[23],Sea Cucumber[24],
JavaRock[25]
C# Kiwi[26]
Python PHDL[27],MyHDL[28]
Ruby RHDL[29]
ML CAPH[30]
Fortran DeepC Compiler[7],ROCCC[31],SRC-6[32]
Haskell Lava[33], Bluespec System Verilog[34](BSV)
Matlab MATCH[35],DEFACTO Compiler[10]
た言語および言語処理系では,高水準言語の機能を
用いて記述された部分とハードウェア化の対象とな
また,オブジェクト指向言語において,クラスのイ
ンスタンスの動的な生成を実現するのは困難である.
第391回 PTT 2013. 6. 28
盛り上がりを見せる高位合成処理系市場!!
19
AutoESL,OpenCL,ImupluseC,CWB...などなどなど
第391回 PTT 2013. 6. 28
沢山の高位合成言語/処理系(設計方針別)
20
タイプ1: 既存の言語を活用したHDL(文法.型の導入)
タイプ2: 既存の言語をそのままHWに
タイプ3: 抽象度の高い新しいHDL
コンパイラでがんばる
FPGAをどう活用するか,が
洗練されていて素敵!!
型?型クラス? レジスタ? 高階関数
既存の言語に文法,型を導入
馴染みの文法でハードウェア記述ができる
デバッグに時間がかかる(RTL/TLMでシミュレーション)
第391回 PTT 2013. 6. 28
沢山の高位合成言語/処理系(設計方針別)
21
タイプ1: 既存の言語を活用したHDL(文法.型の導入)
タイプ2: 既存の言語をそのままHWに
タイプ3: 抽象度の高い新しいHDL
コンパイラでがんばる
FPGAをどう活用するか,が
洗練されていて素敵!!
型?型クラス? レジスタ? 高階関数
既存の言語に文法,型を導入
馴染みの文法でハードウェア記述ができる
デバッグに時間がかかる(RTL/TLMでシミュレーション)
第391回 PTT 2013. 6. 28
高位合成処理系 入力言語として見たJava
22
クラスによるオブジェクト指向設計         
←HWのモジュール設計との親和性が高そう
Threadやwait-notify,synchronizedの仕組み       
←言語仕様内で並列性の記述ができそう
明示的なポインタを扱う必要がない        
←言語の想定するメモリ構造から自由になれそう
動的な振る舞いがたくさんある          
←HW化するのは厄介そう
コンパイラでがんばれるか?
作ってみよう
第391回 PTT 2013. 6. 28
Java プログラムを取り扱う時の選択肢
ソースコードレベル
高い抽象度でプログラムの解析が可能
動的な振る舞い,未決定なものが多数
バイトコードレベル
各種最適化が完了
比較的動的な振る舞いが決定されている
スタックベースの呪縛
24
第391回 PTT 2013. 6. 28
JavaRockの設計方針
JavaプログラムをそのままHW化する
追加構文,データ型は導入しない
記述に制限は加える
プログラムカウンタをステートマシンに置換
1文1ステート
forやwhileに合わせたステートマシン生成
メソッド呼び出し相当のHDLコード生成
25
第391回 PTT 2013. 6. 28
JavaRockの設計方針
HDLで書けることをJavaで書けるようにする で
はない
Javaで書けることを全部HDLにする ではない
26
フェッチのないJavaプロセッサの生成
あるいは
Java(のサブセット)を実行可能なHDLコード規約
第391回 PTT 2013. 6. 28
コードの例
27
第391回 PTT 2013. 6. 28
コンパイルフロー
28
.java
Java Compiler Flontend
Java Compiler Backend
.vhdl
Synthesis/Place & Route
.class
Java Compiler Frontend
Java Compiler Backend
.vhd
Synthesis + Place&Route
.class
.java
第391回 PTT 2013. 6. 28
ソフトウェアとハードウェアで同じ動作
29
の Java の活用手法の検討 9
図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデ
バッグ
JVM FPGA
15 connect6 のデバッグで用いたクラスのクラス図
VGAJavaTestSwingFrame VGAIf
VGAWrapper
Executable as Software
JVM FPGA
Implement-able onto FPGA
monitor
vgavga
HDL modules
SwingCanvas
グラフィクス描画ハードウェア設計のためのクラス構造
FTPPlayer.java として Java で実装する.
15 に,Java で実装した connect6 をデバッ
る際に利用したクラス群のクラス図を示す.
Player と Calculator からなる ICFPT で提
れた connect6 プレイヤは,他の幾つかのプレー
装と共に Player インターフェイスを実装するク
である.このクラスのインスタンスは,Game と
図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデ
バッグ
図 18 VGA グラフィクス描画ハードウェア
作成した描画対象である SwingFrame をインスタンシ
エーションすることで図 17 に示すようにソフトウェ
どうやって
JavaをHDLにするか
第391回 PTT 2013. 6. 28
ソースコードレベルでHDLにするので
31
.java
Java Compiler Flontend
Java Compiler Backend
.vhdl
Synthesis/Place & Route
.class
Java Compiler Frontend
Java Compiler Backend
.java
.vhd
Synthesis + Place&Route
.class
第391回 PTT 2013. 6. 28
Javaのソースコード解析
32
OpenJDK(http://openjdk.java.net)のjavacを活用
コンパイラ本体: com.sun.tools.javac.main.JavaCompiler.java
genCode(Env<AttrContext> env, JCClassDecl cdef) ∼
compile(List<JavaFileObject> sourceFileObjects,
List<String> classnames,
Iterable<? extends Processor> processors)∼
与えられたソースコードをJavaRockツリーに変換
クラス間の関係の解析,モジュールの結合を決定
最適化
コード生成
コンパイル処理の途中にフックを追加
第391回 PTT 2013. 6. 28
Java構文木をHDL構文木に変換
33
width 変数のビット幅を指定する
class
var decl
method decl
var decl
block
block
while
for
if
expr statement
var decl
continue
block
return
expr
ident
binary expr
unary expr
method invocation
assign
parens expr
array access
図 3 Java の構文木の一部
のモジュールにアクセスする Java プログラムをコン
パイルできるように,JRHI として,その HDL ライ
ブラリの入出力ポートを変数として持つラッパークラ
スを Java で記述する.HDL で処理されたモジュール
を利用するクラスは,このラッパークラスに宣言され
1: publ
2: pub
3: i
4: f
5:
6: }
7: r
8: }
9: }
図
Java
定義さ
と類似
くは直
報処理学会論文誌 May 2007
ンを
変換する
る
entity
signal decl
process
state machine
state machine
while
for
if
expr statement
continue
block
return
expr
ident
binary expr
unary expr
method invocation
parens expr
array access
architecture
assign
図 4 JavaRock で扱う VHDL の構文木 (抜粋)
第391回 PTT 2013. 6. 28
生成する基本モジュール
34
Vol. 48 No. 5 FPGA 向け高位合成言語としての
sum: entity
sum: process
clk
reset
input_port_sum_a_waddr[31:0]
input_port_sum_a_wdata[31:0]
input_port_sum_a_we[0:0] output_port_sum[31:0]
sum_method_busy
sum_method_request
input_port_sum_a_length
notify_method_request notify_method_busy
1
2
3
4
5
6
7
8
9
10
11
12
13
ation
r
ン
イ
ラ
ル
れ
り,
ラ
図 4 JavaRock で扱う VHDL の構文木 (抜粋)
1: public class sum{
2: public int sum(int[] a){
3: int sum = 0;
4: for(int i = 0; i < a.length; i++){
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求める Java のプログラム
Java のクラスを VHDL エンティティに,クラス内で
定義されたメソッドはそのエンティティのプロセスに,
と類似する要素に変換できるが,Java の制御構文の多
くは直接 VHDL に変換することはできない.そのた
め Java のプログラムと同様のデータ処理を実現する
ためのハードウェアアーキテクチャを作る必要がある.
第391回 PTT 2013. 6. 28
コード生成規約: 基本的なストラテジ
Javaの1文を1ステートとするステートマシン
ブロック文はさらにステートマシンを分割
if,while,for,{}
配列アクセスはBRAMアクセスに分解
35
sum: entity
sum: process
clk
reset
input_port_sum_a_waddr[31:0]
input_port_sum_a_wdata[31:0]
input_port_sum_a_we[0:0] output_port_sum[31:0]
sum_method_busy
sum_method_request
input_port_sum_a_length
notify_method_request notify_method_busy
図 6 図 5 から生成されるハードウェアアーキテクチャの外観
1: case conv_integer(sum_method_state) is
2: ...
3: when 2 =>
4: sum_0 <= conv_std_logic_vector(0, 31-0+1);
5: sum_method_state <= sum_method_state + 1;
6: when 3 =>
7: ...
図 7 文のステートマシンへの変換例
ation
r
ン
イ
ラ
ル
れ
り,
ラ
1: public class sum{
2: public int sum(int[] a){
3: int sum = 0;
4: for(int i = 0; i < a.length; i++){
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求める Java のプログラム
Java のクラスを VHDL エンティティに,クラス内で
定義されたメソッドはそのエンティティのプロセスに,
と類似する要素に変換できるが,Java の制御構文の多
くは直接 VHDL に変換することはできない.そのた
め Java のプログラムと同様のデータ処理を実現する
ためのハードウェアアーキテクチャを作る必要がある.
ステート変数
上記のJavaコードに相当するステート
ation
r
ン
イ
ラ
ル
れ
り,
ラ
1: public class sum{
2: public int sum(int[] a){
3: int sum = 0;
4: for(int i = 0; i < a.length; i++){
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求める Java のプログラム
Java のクラスを VHDL エンティティに,クラス内で
定義されたメソッドはそのエンティティのプロセスに,
と類似する要素に変換できるが,Java の制御構文の多
くは直接 VHDL に変換することはできない.そのた
め Java のプログラムと同様のデータ処理を実現する
ためのハードウェアアーキテクチャを作る必要がある.
長くなるので次のスライドへ
ての Java の活用手法の検討 5
1: case conv_integer(sum_method_state) is
2: ...
3: when 3 =>
4: case conv_integer(state_counter_sum_1) is
5: when 0 =>
6: i_1 <= conv_std_logic_vector(0, 31-0+1);
7: state_counter_sum_1 <= state_counter_sum_1 + 1;
8: when 1 =>
9: if (conv_integer(i_1) < input_port_sum_a_length) then
10: state_counter_sum_1 <= state_counter_sum_1 + 1;
11: else
12: sum_method_state <= sum_method_state + 1;
13: state_counter_sum_1 <= (others => ’0’);
14: end if;
15: when 2 =>
16: ...
17: when 3 =>
18: i_1 <= conv_std_logic_vector(conv_integer(i_1 + 1), 31-0+1);
19: state_counter_sum_1 <= conv_std_logic_vector(1, 32);
20: when others => state_counter_sum_1 <= (others => ’0’);
21: end case;
22: when 4 =>
23: ...
int sum = 0;
for(int i = 0; i < a.length; i++){
sum += a[i];
}
return sum;
}
図 5 与えられた配列の合計値を求める Java のプ
va のクラスを VHDL エンティティに,ク
義されたメソッドはそのエンティティのプ
類似する要素に変換できるが,Java の制御
assign
parens expr
array access
部
ログラムをコン
,その HDL ライ
持つラッパークラ
されたモジュール
クラスに宣言され
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列
Java のクラスを VH
定義されたメソッド
と類似する要素に変
くは直接 VHDL に
ステート変数
このforループのステート変数
init式cond式
update式
ation
r
ン
イ
ラ
ル
れ
り,
ラ
1: public class sum{
2: public int sum(int[] a){
3: int sum = 0;
4: for(int i = 0; i < a.length; i++){
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求める Java のプログラム
Java のクラスを VHDL エンティティに,クラス内で
定義されたメソッドはそのエンティティのプロセスに,
と類似する要素に変換できるが,Java の制御構文の多
くは直接 VHDL に変換することはできない.そのた
め Java のプログラムと同様のデータ処理を実現する
ためのハードウェアアーキテクチャを作る必要がある.
これも,長くなるので次のスライドへ
1: when 2 =>
2: case conv_integer(state_counter_sum_2) is
3: when 0 =>
4: case conv_integer(array_index_operation_state_counter_3) is
5: when 0 =>
6: param_input_port_sum_a_raddr <=
conv_std_logic_vector(conv_integer(i_1), 11-1-0+1);
7: array_index_operation_state_counter_3 <=
array_index_operation_state_counter_3 + 1;
8: when 1 =>
9: array_index_operation_state_counter_3 <= (others => ’0’);
10: state_counter_sum_2 <= state_counter_sum_2 + 1;
11: when others => array_index_operation_state_counter_3 <=
(others => ’0’);
12: end case;
13: when 1 =>
14: sum_0 <= conv_std_logic_vector(
conv_integer(sum_0 + param_input_port_sum_a_rdata), 31-0+1);
15: state_counter_sum_1 <= state_counter_sum_1 + 1;
16: state_counter_sum_2 <= (others => ’0’);
17: when others => state_counter_sum_2 <= (others => ’0’);
18: end case;
19: when 3 =>
20: ...
for(int i = 0; i < a.length; i++){
sum += a[i];
}
return sum;
図 5 与えられた配列の合計値を求める Java のプロ
a のクラスを VHDL エンティティに,ク
義されたメソッドはそのエンティティのプロ
類似する要素に変換できるが,Java の制御
は直接 VHDL に変換することはできない
メモリアクセスのステート変数
読むアドレスを指定
1サイクル待たないといけない
データを読んでsumに加算
第391回 PTT 2013. 6. 28
コード生成規約: メソッド呼び出し
41
Java
こういう枠にはめる.
public class Hoge{
// メソッド定義
public int zero(){ return 0; }
Hoge hoge = new Hoge();
...
hoge.zero(); // メソッド呼出し
timecalleecaller
_req <= ’1’
_req <= ’0’
_busy <= ’1’
_busy <= ’0’
set parameters
wait for
method execution method execution
呼ぶ側 呼ばれる側
ation
r
ン
イ
ラ
ル
れ
り,
ラ
1: public class sum{
2: public int sum(int[] a){
3: int sum = 0;
4: for(int i = 0; i < a.length; i++){
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求める Java のプログラム
Java のクラスを VHDL エンティティに,クラス内で
定義されたメソッドはそのエンティティのプロセスに,
と類似する要素に変換できるが,Java の制御構文の多
くは直接 VHDL に変換することはできない.そのた
め Java のプログラムと同様のデータ処理を実現する
ためのハードウェアアーキテクチャを作る必要がある.
これも,長くなるので次のスライドへ
1: case conv_integer(sum_method_state) is
2: when 0 =>
3: if(sum_method_request = ’1’) then
4: sum_method_busy <= ’1’;
5: sum_method_state <= sum_method_state + 1;
6: else
7: sum_method_busy <= ’0’;
8: end if;
9: when 1 =>
10: if(sum_method_request = ’0’) then
11: sum_method_state <= sum_method_state + 1;
12: end if;
13: when 2 =>
14: ...
15: when 4 =>
16: output_port_sum <= conv_std_logic_vector(conv_integer(sum_0), 31-0+1);
17: sum_method_state <= (others => ’0’);
15: when 5 =>
16: sum_method_busy <= ’0’;
17: sum_method_state <= (others => ’0’);
18: when others => sum_method_state <= (others => ’0’);
19: end case;
class sum{
c int sum(int[] a){
sum = 0;
(int i = 0; i < a.length; i++){
um += a[i];
urn sum;
与えられた配列の合計値を求める Java のプログ
のクラスを VHDL エンティティに,クラ
れたメソッドはそのエンティティのプロセ
xpr
ss
コン
ライ
クラ
ール
され
5: sum += a[i];
6: }
7: return sum;
8: }
9: }
図 5 与えられた配列の合計値を求め
Java のクラスを VHDL エンテ
定義されたメソッドはそのエンテ
と類似する要素に変換できるが,
くは直接 VHDL に変換すること
メソッドが呼び出されるのを待つ
この間にパラメタを引き渡す
終わったら,返戻値をセットしておしまい
FPGAを活用するために
第391回 PTT 2013. 6. 28
FPGAを 活用 するために
並列化
細粒度自動並列化
ユーザによるThreadレベル並列化
HDLモジュールの利用
JavaRock Hardware Interface(JRHI)
JavaRock HDL
45
第391回 PTT 2013. 6. 28
並列化手法
演算レベルの並列性
 →基本ブロック内の自動並列化
タスク・データレベルの並列性
 →JavaのスレッドをHWにマッピング
パイプライン並列性
 →wait-notifyで記述
 →JavaRock HDLでの記述
46
第391回 PTT 2013. 6. 28
JavaのスレッドをHWにマッピング
47
timecalleecaller
_req <= ’1’
_req <= ’0’
_busy <= ’1’
_busy <= ’0’
set parameters
wait for
method execution method execution
スレッドの生成
&
実行
startではメソッドの
終了を待たない
第391回 PTT 2013. 6. 28
HDLモジュールの活用
48
IPコア,手書きHDLモジュールの活用
ハードウェアを意識したJavaコード記述支援
Java JRHI
VHDL, Verilog,
FPGA Javaで書けない(書きにくい)
モジュール
JavaとRTLの間を埋める
JavaRock HDL
第391回 PTT 2013. 6. 28
JavaRock Hardware Interface
49
VHDL/Verilogで記述したモジュールを使いたい
Javaからみて自然な形でアクセスしたい
Javaプログラム中に変な記述をいれたくない
VHDL/Verilogモジュールの入出力をJavaの変数
HDL中で定義したブロックRAMを配列にみせる
第391回 PTT 2013. 6. 28
JRHIの使いどころ
50
メモリ
グラフィクスコントローラ
 →制御タイミングが重要
FPGA内部の専用HWリソース
 →BlockRAM(内蔵メモリ)
 →DSP
既存のHDLコードの活用
第391回 PTT 2013. 6. 28
JavaRock Hardware Interface
51
使いたいHDLモジュール
JRHIクラス
第391回 PTT 2013. 6. 28
JRHIの利用
52
public class SC1602_USER{
private final SC1602Wrapper obj = new SC1602Wrapper();
public void put(){
obj.pWrData = (byte) a ;
obj.pWrAddr = 0;
obj.pWrWr = true;
obj.pWrWr = false;
obj.pReq = true;
obj.pReq = false;
}
Javaプログラムとしてコンパイルが可能
JavaRockでHDLなsc1602_wrapperと
組み合わせる
第391回 PTT 2013. 6. 28
もう一歩すすんだJRHIの活用
53
public class MemoryDevice extends ∼{
public byte[] byte_data;
public int[] int_data;
public MemoryDevice(String... args){
super( memory , args);
public class MemoryDevice_USER{
private final MemoryDevice obj = new MemoryDevice();
public void put(){
obj.byte_data[0] = (byte)100;
obj.int_data[0] = 1000;
}
ヒープメモリの一部をHDLモジュール内の
メモリに見せるというような使い方が可能
第391回 PTT 2013. 6. 28
JavaRock HDL
54
アノテーションによるJavaのHDL化
第391回 PTT 2013. 6. 28
アノテーション
55
アノテーション 概要 対象
@javarockhdl このクラスがJavaRockHDLであることを示す クラス
@raw メソッド内のifやwhileの条件判定式をHDLに直接変換 メソッド
@auto メソッドが呼び出されることなく動作するようにする メソッド
@width 変数のbit幅を定義する 変数
@no_wait メソッド終了を待たずメソッド呼出し元の処理を進める メソッド
第391回 PTT 2013. 6. 28
JavaRockの制限
インスタンスはファイナルでの生成のみ
スタティックなHWモジュールとして合成
インスタンスの共有は不可
管理用の信号のアービトレーション未実装
浮動小数点数演算は不可
配列はプリミティブ型(除float/double)のみ
/とか%とか未サポート
56
第391回 PTT 2013. 6. 28
適用事例 1/5
57
はじめてのFPGAプログラミング (by 村主さん)
http://d.hatena.ne.jp/nushio/20120708
約半日の成果
第391回 PTT 2013. 6. 28
制御分野にFPGAを導入したい
電気自動車の制御 < 50μ秒
3.8m秒@H8 → 6.3μ秒@FPGA
適用事例 2/5
58
倒立振子 (by 宇都宮大学 大川先生)
今後の課題
• FPGA倒立振子ロボットを完成させる
• モジュールの結合テスト
• モジュールを結合したうえでの
並列化
• 倒立振子の制御動作を確認
FPGA
倒立振子
マイコン
倒立振子
評価結果(平均化処理)
経過時間(マイクロ秒)
平均化処理にマイコンで1.5ミリ秒かかっていたのが
FPGAで2.9マイクロ秒に短縮
2013/3/7 第75回全国大会 15
2.88
11.7
22.68
0
5
10
15
20
25
10要素 50要素 100要素
植竹 他 "倒立振子ロボットのFPGAを用いた超高速制御"
情報処理学会第75回全国大会
第391回 PTT 2013. 6. 28
SHA-1
エッジ検出(3x3ラプラシアンフィルタ)
適用事例 3/5
59
Reconfigurable Android (by 農工大 中條研)
Vol.53 No.2 1–9 (Feb. 2012)
ck b Thread
hod call of JavaRock b parallel processing
10 Application Reference Platform for Image Proce
(Atom Z530 1.6GHz)
(XC6SLX45T)
a
A
k
Table 5 Performance comparison in edge detection
[MHz]
JavaRock 178 61439
153 4096
6 SHA-1
Table 6 Execution time of SHA-1
[ms]
Java 3360
Andoird NDK 51.7
FPGA 41.3
FPGA JavaRock 209
1
64 64
CPU FPGA
SHA-1 1Mbyte
512 512
Android Java
NDK C
SHA-1 6
7
Vol.53 No.2 1–9 (Feb. 2012)
7
Table 7 Execution time of edge detection
[ms]
Java 392
Andoird NDK 8.85
FPGA 8.83
FPGA JavaRock 105
6.1
JavaRock [1] Java
JavaRock jar
boolean A;
private void func0 (){
A = true;
}
private void func1 (){
A = false;
}
11 1
Fig. 11 Writing a variable from mul
第391回 PTT 2013. 6. 28
適用事例 4/5
60
ハードウェアシステムのコンソールなど
文字列処理
“192.168.10.1” → 0xc0, 0xa8, 0x0a, 0x01
第391回 PTT 2013. 6. 28
Networked FPGA system based on ORB
適用事例 5/5
61
ORB Engine with JavaRock
T. Ohkawa et al., "Reconfigurable and Hardwired ORB Engine on FPGA by Java-
to-HDL Synthesizer for Realtime Application," Proc. 4th International
Symposium on Highly Efficient Accelerators and Reconfigurable Technologies
(HEART 2013), June 2013.
hand-coded primitive protocol. It is efficient and high-
speed, however, difficult to develop complex system and
hard to maintain. It is shown that the overhead of ORB
protocol processing compared to RAW protocol system is
very small (about 70us).
The system clock frequency of the FPGA is 50MHz. As
compared to the software ORB on MicroBlaze soft-core
processor shown in Figure 5, the latency time was reduced
dramatically (from 1.5ms to 200 us, @ 50MHz).
0
200
400
600
800
1000
1 2 3 4 5
Delay[us] Remote Calls
ORB (PC)
ORB (FPGA)
Raw (PC)
Raw (FPGA)
Figure 11 Measurement performance of the synthesized ORB
Protocol Engine compared to RAW protocol system
0
2000
4000
6000
0
20
40
60
torOutput
e)andangle(Frame)
degree]
z
angle
out
次のステップ:
JavaRock2に向けて
インスタンスの扱いの制限が大きい
継承やインターフェースが活用できない/活用したい
コンストラクタが使えない/使いたい
文字列が扱えない/扱いたい
文字列/配列の初期値を与えられない/与えたい
例外が取り扱えない/取り扱いたい
時間管理
VHDL/Verilogへの安直なマッピングによる弊害
JavaRock-Thrashの成果の活用
現状のJavaRockの課題/要望
63
インスタンスの扱いの制限が大きい
継承やインターフェースが活用できない/活用したい
コンストラクタが使えない/使いたい
文字列が扱えない/扱いたい
文字列/配列の初期値を与えられない/与えたい
例外が取り扱えない/取り扱いたい
時間管理
VHDL/Verilogへの安直なマッピングによる弊害
JavaRock-Thrashの成果の活用
現状のJavaRockの課題/要望
64
現状のインスタンスの扱いの制限
インスタンスは1つのインスタンスに従属
外からフィールドアクセス(a.c.value = 0)
インスタンスをメソッド引数として
インスタンスをメソッドの返戻値として
インターフェース,親クラスで扱えない
65
→ 静的にインスタンスを配線しているのが問題?
インスタンスは一つのインスタンスに従属
66
インスタンスa
インスタンスb
インスタンスc
インスタンスe
インスタンスd
a→dへのアクセスを可能にするには
c.dへの制御ポートをすべてaに見せ,かつ調停する必要がある
インスタンスをどう取り扱うか
funcを呼ぶ可能性のある箇所を検索
してポインタをたどる?
動的にポインタを切り替えられるよ
うな仕組みを作る
67
class A{
B b = new B();
C c = new C();
func(D d){
...
}
}
b
c
d0
d1
?
ソフトウェアと同じモデル.
ポインタをたどるための機構
がボトルネックになる?
何かしらの
アービトレーション機構?
調停機構
68
Instance
Instance
Instance
Instance
Instance
Instance
caller callee
調停機構を考慮したメソッドI/F
69
Vol. 48 No. 5 FPGA 向け高位合成言語としての Java の
sum: entity
sum: process
clk
reset
input_port_sum_a_waddr[31:0]
input_port_sum_a_wdata[31:0]
input_port_sum_a_we[0:0] output_port_sum[31:0]
sum_method_busy
sum_method_request
input_port_sum_a_length
notify_method_request notify_method_busy
図 6 図 5 から生成されるハードウェアアーキテクチャの外観
1: case conv_integer(sum_method_state) is
2: ...
3: when 2 =>
4: sum_0 <= conv_std_logic_vector(0, 31-0+1);
5: sum_method_state <= sum_method_state + 1;
6: when 3 =>
7: ...
図 7 文のステートマシンへの変換例
1: case conv_
2: ...
3: when 3 =
4: case c
5: when
6: i_
7: st
8: when
9: if
10:
11: el
12:
13:
14: en
15: when
16:
17: when
18:
19:
20: when
21: end ca
22: when 4 =
23: ...
現状のメソッドI/F
Ctrl(Req, Ack, Busy)
Input params Return value
新しいメソッドI/F
モジュール同士が密結合になる
- どんなモジュールでも統一のI/FでOK!!
メソッド呼び出し
70
Req(Callee ID)
Ack(Caller ID)
Method ID
Method ID
#. of Args
#. of Args
Arg 0
Arg 0
Arg n
Arg n
Caller Instance Callee InstanceArbiter
Done
Done
メソッド呼び出し
Instance ID: 各インスタンスに静的に付与
Method ID: 各メソッドに静的に付与
Req/Ack: アクセスを許可したインスタンスIDを出力
インスタンス毎に1メソッドずつしか呼べない
Args: 即値は値渡し,インスタンス/配列はID渡し
71
調停機構による性能低下を抑えるために
自分だけがアクセスするインスタンスへの
との接続は現状通り合成時に生成
他のインスタンスもアクセスする可能性の
あるインスタンスへのアクセスは調停機構
経由で接続
72
現状のメソッドI/F機構とのハイブリッド
String/配列の扱い
配列はBlockRAMを隠 した独自クラス
Stringはchar配列ベースの独自クラス
他のインスタンス同様IDを付与して管理
初期値はリセット解除後にinitシーケンスを
走らせて設定する
73
継承
静的に親クラスのメソッドを追加する
Objectにあるメソッド clone(), equals(),
finalize(), getClass(), hashCode(),
notify(), notifyAll(), toString(), wait(),
wait(long timeout), wait(long timeout,
int nanos)に対応
74
例外
現状では対応していない(無視する)
遷移: return同様の大域脱出
new XXException()は無理
final なXXExceptionを投げる
インスタンスのやり取りができれば解決
75
時間管理
Thread.sleepなど基準時間があると楽
案1: 内部クロックを固定
コンパイル時に与える
案2: RTCを別途用意する
回路のクロックは最大周波数に応じて好
きに決められる
76
コンパイルパスの整理
1. クラスのリストアップ
2. 各クラスのエンティティを生成
3. インスタンスの関係情報を構築
4. Arbiter,トップエンティティの生成
5. 各クラスのアーキテクチャ生成
6. VHDLとして出力
77
その他
式の分解/組み立てをまじめに実装する
a = b = c; みたいなものが扱えるように
a[i++] が扱えるように
(a + b) >> 8 が扱えるように(functionの活用?)
JavaRockHDLの整理
ライブラリの整理
Thread(Runnable obj)が使えるように
78
その他(2)
GUI(JavaRock.Pop)なコード生成ツール
AXIやQsysへの乗り入れ
newによる動的な回路生成??/GC??
JavaRockという名前は問題??
79
AXI
Main Logic
generated by JavaRock
Main Logic
generated by VHDL/Verilog
Central
Direct Memory Access Controller
DDR3
PCIe Controller
ロジック
ロジック
DMA
DDR3
PCIe
関連プロジェクト
浮動小数点数演算
使用する演算リソースをコンフィグ
レジスタ共有,ループアンローリング
80
JavaRock-Thrash by 農工大 中條研 小池さん
おわりに
JavaRockを作っています
JavaプログラムをHDLに変換します
JavaRock2を計画中です
81

Contenu connexe

Tendances

高速シリアル通信を支える技術
高速シリアル通信を支える技術高速シリアル通信を支える技術
高速シリアル通信を支える技術
Natsutani Minoru
 

Tendances (20)

Fpga local 20130322
Fpga local 20130322Fpga local 20130322
Fpga local 20130322
 
Fpgax 20130604
Fpgax 20130604Fpgax 20130604
Fpgax 20130604
 
Zynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチZynq VIPを利用したテストベンチ
Zynq VIPを利用したテストベンチ
 
Vyatta 201310
Vyatta 201310Vyatta 201310
Vyatta 201310
 
Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
FPGAによる津波シミュレーション -- GPUを超える高性能計算の手法
 
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
FPGAで作るOpenFlow Switch (FPGAエクストリーム・コンピューティング 第6回) FPGAX#6
 
FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料FPGA+SoC+Linux実践勉強会資料
FPGA+SoC+Linux実践勉強会資料
 
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編Xilinx SDSoC(2016.2)解体新書ソフトウェア編
Xilinx SDSoC(2016.2)解体新書ソフトウェア編
 
SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
 
Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
 
高速シリアル通信を支える技術
高速シリアル通信を支える技術高速シリアル通信を支える技術
高速シリアル通信を支える技術
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門
 
ハードウェア技術の動向 2015/02/02
ハードウェア技術の動向 2015/02/02ハードウェア技術の動向 2015/02/02
ハードウェア技術の動向 2015/02/02
 
GoBGP活用によるSD-WANプラクティス
GoBGP活用によるSD-WANプラクティスGoBGP活用によるSD-WANプラクティス
GoBGP活用によるSD-WANプラクティス
 
Java トラブル解析支援ツール HeapStats のご紹介
Java トラブル解析支援ツール HeapStats のご紹介Java トラブル解析支援ツール HeapStats のご紹介
Java トラブル解析支援ツール HeapStats のご紹介
 
Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編Xilinx SDSoC(2016.3)解体新書ソフトウェア編
Xilinx SDSoC(2016.3)解体新書ソフトウェア編
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
 

Similaire à Ptt391

Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側
Yasumasa Suenaga
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
kimukou_26 Kimukou
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
EIICHI KIMURA
 

Similaire à Ptt391 (20)

Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?これからのJDK/JVM 何を選ぶ?どう選ぶ?
これからのJDK/JVM 何を選ぶ?どう選ぶ?
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration[JavaOne Tokyo 2012] JavaFX and Web Integration
[JavaOne Tokyo 2012] JavaFX and Web Integration
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
 
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoOpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
 
Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
GNS3上の仮想アプライアンス+GitLabRunner+BDDによるテスト自動化
GNS3上の仮想アプライアンス+GitLabRunner+BDDによるテスト自動化GNS3上の仮想アプライアンス+GitLabRunner+BDDによるテスト自動化
GNS3上の仮想アプライアンス+GitLabRunner+BDDによるテスト自動化
 
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 

Plus de Takefumi MIYOSHI

Plus de Takefumi MIYOSHI (19)

ACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyoACRi_webinar_20220118_miyo
ACRi_webinar_20220118_miyo
 
DAS_202109
DAS_202109DAS_202109
DAS_202109
 
ACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組みACRiルーム1年間の活動と 新たな取り組み
ACRiルーム1年間の活動と 新たな取り組み
 
RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29RISC-V introduction for SIG SDR in CQ 2019.07.29
RISC-V introduction for SIG SDR in CQ 2019.07.29
 
Misc for edge_devices_with_fpga
Misc for edge_devices_with_fpgaMisc for edge_devices_with_fpga
Misc for edge_devices_with_fpga
 
Cq off 20190718
Cq off 20190718Cq off 20190718
Cq off 20190718
 
Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511Synthesijer - HLS frineds 20190511
Synthesijer - HLS frineds 20190511
 
Reconf 201901
Reconf 201901Reconf 201901
Reconf 201901
 
Hls friends 201803.key
Hls friends 201803.keyHls friends 201803.key
Hls friends 201803.key
 
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
 
Slide
SlideSlide
Slide
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 
Das 2015
Das 2015Das 2015
Das 2015
 
Synthesijer jjug 201504_01
Synthesijer jjug 201504_01Synthesijer jjug 201504_01
Synthesijer jjug 201504_01
 
Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316Synthesijer zynq qs_20150316
Synthesijer zynq qs_20150316
 
Synthesijer fpgax 20150201
Synthesijer fpgax 20150201Synthesijer fpgax 20150201
Synthesijer fpgax 20150201
 
Synthesijer hls 20150116
Synthesijer hls 20150116Synthesijer hls 20150116
Synthesijer hls 20150116
 
Fpgax 20130830
Fpgax 20130830Fpgax 20130830
Fpgax 20130830
 
Bluespec @waseda(PDF)
Bluespec @waseda(PDF)Bluespec @waseda(PDF)
Bluespec @waseda(PDF)
 

Ptt391

  • 1. 第391回 PTT 2013. 6. 28 JavaRockの実装と設計, そして,次へのステップ 三好 健文 株式会社イーツリーズ・ジャパン 1
  • 2. 第391回 PTT 2013. 6. 28 .java% Java % .vhdl% Java % / JavaRock% JVM% JavaRockとは 2 JavaRockの目指すところ JavaプログラムをそのままHDLに変換→FPGA上のHWにする 追加構文,データ型は導入しない 記述に制限は加える HDLで書けることをJavaで書けるようにする ではない Javaで書けることを全部HDLにする ではない http://javarock.sourceforge.net/ テキスト
  • 3. 第391回 PTT 2013. 6. 28 今日の流れ FPGAと高位合成処理系について JavaRockの実装と設計 JavaRock2の計画 3
  • 4. 第391回 PTT 2013. 6. 28 FPGAとは 4 論理回路・データパスを自由に作り込める クロックレベルの同期と並列性の活用 Field Programmable Gate Array HDLがドレスを着たお姫さまだとすると,コンパイル時 にエラーをしっかり検出してくれるが故にコンパイルを通 すのが困難な反面,コンパイルさえ通れば合成した回路が きちんと動作してくれるBluespecはパワフルなツンデレ 娘と筆者はイメージしています(図2).  Verilog HDLやVHDLを使った設計で, ― あぁ∼,数字って32ビットだった.うっかりキャスト されていたよ… ― テスト・ベンチのステート・マシンを書くのが面倒だな. ― モジュールのインスタンシーエーションで入出力ピン をつなぎ忘れていた という思いをしたことはありませんか?  単純な記述の羅列や細かいミスへの注力が続くと,本来 力を入れるべき,アーキテクチャの設計まで億劫になって しまいます.また,「コンパイル(論理合成)は通るのに, シミュレーションやFPGA上で動作させると,何かおか しい」という事態に頭を悩ませ,原因はうっかりミスだっ たということも一度や二度ではないと思います.  記述の手間がもっと省けて,コンパイル時に強力にエ ラー・チェックしてくれるHDL言語ないかなあ…という 要求に応えてくれるのがBluespec System Verilogです (図1).VHDLがまじめなキャリア・ウーマン,Verilog ▲ 図2 Bluespec System Verilogは ツ ンデレ娘 きっちりしていてキャリアも長いVHDL,あいま 新世代のESL合成ソリューション Bluespec System Verilogのすすめ  本章では,高位設計言語であるBluespec System Verilogを紹介する.こ の言語では,コンパイル時にしっかりエラー検出ができ,また,さまざまなライブ ラリも提供している.FPGAやASICが大規模化し複雑な回路を設計する機会が 増えてきた今,知っておくべき技術だろう. (編集部) 三好 健文 出典: CQ出版 Interface 2011年2月号より
  • 5. 第391回 PTT 2013. 6. 28 FPGAの活用シーン 5 独自の回路を実現できるハードウェア 特定の処理を低消費電力で高性能処理 デバイスに近い処理を簡単に実現 自由なI/Oポートの定義 ASIC開発のプロトタイプとして 特定用途向け少数生産の製品として
  • 6. 第391回 PTT 2013. 6. 28 例) freeocean 6 最大スループット: 1Gbps 最大同時処理コネクション数: 50万 秒間同時接続数: 約2万HTTPリクエスト 最大消費電力: 300W以下 ハードウェアWebキャッシュサーバ
  • 7. 第391回 PTT 2013. 6. 28 演算リソースとしてのFPGAの魅力 7 http://www.altera.com/literature/wp/wp-01142-teraflops.pdf Smith-Waterman 法による多重配列アライメン ト処理とモンテカルロ法 ベースの金融シミュレーショ ンを FPGA で実行した場合,それぞれ CPU に比べ て 228 倍と 545 倍高速に処理できた [ 1 ] Reconfigurable Computing in the Multi-Core Era. In Internal Workshop on Highly-Efficient Accelerators and Reconfigurable Technologies, 2010. < 1.25 TFLOPS, 10∼12GFLOPS/W CPUと比べて高い処理能力 数値計算性能 内蔵DSPを活用して...
  • 8. 第391回 PTT 2013. 6. 28 FPGAの応用事例 8 1) http://www.thenewstribe.com/2012/11/01/infotech-becomes-pakistans-first-netezza-certified-ibm-partner/ 2) http://techon.nikkeibp.co.jp/article/NEWS/20110502/191552/ 1) 2) DB,金融,油田探索
  • 9. 第391回 PTT 2013. 6. 28 FPGAアプリケーションの研究事例 9 A Fully Pipelined FPGA Architecture for Stochastic Simulation of Chemical Systems A Hardware Accelerated Approach for Imaging Flow Cytometry Accelerating Solvers for Global Atmospheric Equations though Mixed-Precision Data Flow Engine An FPGA Based Parallel Architecture For Music Melody Matching An FPGA Memcached Appliance High Throughput and Programmable Online Traffic Classifier on FPGA Join Operation for Relational Databases A Packet Classifier using LUT cascades Based on EVMDDs(k) Memory Efficient IP Lookup in 100Gbps Networks A Flexible Hash Table Design for 10GBps Key-Value Stores in FPGAs A Secure Copreocessor for Database Applications Fast, FPGA-based Rainbow Table Creation for Attacking Encrypted Mobile Communications ..... 30+ @FPGA2013, FPL2013, FCCM2013
  • 10. 第391回 PTT 2013. 6. 28 FPGA上のプログラミングとは 10 論理回路構成要素の演算内容を決める 論理回路構成要素同士をどう接続するかを決める cf. http://commons.wikimedia.org/wiki/File:Two_women_operating_ENIAC_(full_resolution).jpg
  • 11. 第391回 PTT 2013. 6. 28 FPGA上のプログラミングとは 11 2) http://hitechglobal.com/boards/virtex7_v2000t.htm 3) http://http://low-powerdesign.com/sleibson/2011/10/25/generation-jumping-2-5d-xilinx- virtex-7-2000t-fpga-delivers-1954560-logic-cells-consumes-only-20w/ 1) http://japan.xilinx.com/support/documentation/data_sheets/ds180_7Series_Overview.pdf 1) 2) 3)
  • 12. 第391回 PTT 2013. 6. 28 FPGAの開発手法の主役 12 HDL(Hardware Description Language) によるRTL(Register Transfer Level)設計 + > a b x y f g h counter+1 clk
  • 13. 第391回 PTT 2013. 6. 28 HDLによる設計のメリット/デメリット 13 ロジックを抽象化した式/構文で設計できる クロックレベルのデータ制御 細粒度の並列性の活用 状態 を自分で管理しなければいけない デバッグ/動作検証が難しい アルゴリズムを設計するには記述が煩雑 メリット デメリット
  • 14. 第391回 PTT 2013. 6. 28 HDLによる設計のデメリットを克服する方法 14 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用
  • 15. 第391回 PTT 2013. 6. 28 HDLによる設計のデメリットを克服する方法 15 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用 環境/ソース保守コストの増大
  • 16. 第391回 PTT 2013. 6. 28 HDLによる設計のデメリットを克服する方法 16 FPGAとは別にプロセッサを持ってくる FPGAの中にプロセッサを作る より抽象度の高い設計をする FPGAを使うのをやめる 高位合成言語/処理系の活用
  • 17. 第391回 PTT 2013. 6. 28 高位合成言語/処理系に何を求めるか 記述コストの軽減 高い抽象度の表現方法を利用したい 言語習得のコストは低く抑えたい 動作検証/デバッグコストの軽減 短時間で動作を確認したい 見通しよく手軽なデバッグをしたい FPGAのパフォーマンスの活用 粗粒度,細粒度の並列性を活用したい IPコア,FPGA内蔵機能を活用したい 17
  • 18. 第391回 PTT 2013. 6. 28 沢山の高位合成言語/処理系 18 Vol. 29 No. 1 Feb. 2012 81 表 1 ベース言語別に分類した高位合成言語の例 ベースの言語 言語名 C BACH-C[5],Handel-C[6],DeepC Compiler[7],PICASSO[8],COBRA-ABS[9], DEFACTO Compiler[10],Streams-C[11],GARP C Compiler[12],SA-C[13], Impulse-C[14],SpecC[15],GorillaC[16] C++ SystemC[17],OCAPI[18],HP-Machine[19] Java Galadriel/Nenya[20],JHDL[21],Lime[22],MaxCompiler[23],Sea Cucumber[24], JavaRock[25] C# Kiwi[26] Python PHDL[27],MyHDL[28] Ruby RHDL[29] ML CAPH[30] Fortran DeepC Compiler[7],ROCCC[31],SRC-6[32] Haskell Lava[33], Bluespec System Verilog[34](BSV) Matlab MATCH[35],DEFACTO Compiler[10] た言語および言語処理系では,高水準言語の機能を 用いて記述された部分とハードウェア化の対象とな また,オブジェクト指向言語において,クラスのイ ンスタンスの動的な生成を実現するのは困難である.
  • 19. 第391回 PTT 2013. 6. 28 盛り上がりを見せる高位合成処理系市場!! 19 AutoESL,OpenCL,ImupluseC,CWB...などなどなど
  • 20. 第391回 PTT 2013. 6. 28 沢山の高位合成言語/処理系(設計方針別) 20 タイプ1: 既存の言語を活用したHDL(文法.型の導入) タイプ2: 既存の言語をそのままHWに タイプ3: 抽象度の高い新しいHDL コンパイラでがんばる FPGAをどう活用するか,が 洗練されていて素敵!! 型?型クラス? レジスタ? 高階関数 既存の言語に文法,型を導入 馴染みの文法でハードウェア記述ができる デバッグに時間がかかる(RTL/TLMでシミュレーション)
  • 21. 第391回 PTT 2013. 6. 28 沢山の高位合成言語/処理系(設計方針別) 21 タイプ1: 既存の言語を活用したHDL(文法.型の導入) タイプ2: 既存の言語をそのままHWに タイプ3: 抽象度の高い新しいHDL コンパイラでがんばる FPGAをどう活用するか,が 洗練されていて素敵!! 型?型クラス? レジスタ? 高階関数 既存の言語に文法,型を導入 馴染みの文法でハードウェア記述ができる デバッグに時間がかかる(RTL/TLMでシミュレーション)
  • 22. 第391回 PTT 2013. 6. 28 高位合成処理系 入力言語として見たJava 22 クラスによるオブジェクト指向設計          ←HWのモジュール設計との親和性が高そう Threadやwait-notify,synchronizedの仕組み        ←言語仕様内で並列性の記述ができそう 明示的なポインタを扱う必要がない         ←言語の想定するメモリ構造から自由になれそう 動的な振る舞いがたくさんある           ←HW化するのは厄介そう コンパイラでがんばれるか?
  • 24. 第391回 PTT 2013. 6. 28 Java プログラムを取り扱う時の選択肢 ソースコードレベル 高い抽象度でプログラムの解析が可能 動的な振る舞い,未決定なものが多数 バイトコードレベル 各種最適化が完了 比較的動的な振る舞いが決定されている スタックベースの呪縛 24
  • 25. 第391回 PTT 2013. 6. 28 JavaRockの設計方針 JavaプログラムをそのままHW化する 追加構文,データ型は導入しない 記述に制限は加える プログラムカウンタをステートマシンに置換 1文1ステート forやwhileに合わせたステートマシン生成 メソッド呼び出し相当のHDLコード生成 25
  • 26. 第391回 PTT 2013. 6. 28 JavaRockの設計方針 HDLで書けることをJavaで書けるようにする で はない Javaで書けることを全部HDLにする ではない 26 フェッチのないJavaプロセッサの生成 あるいは Java(のサブセット)を実行可能なHDLコード規約
  • 27. 第391回 PTT 2013. 6. 28 コードの例 27
  • 28. 第391回 PTT 2013. 6. 28 コンパイルフロー 28 .java Java Compiler Flontend Java Compiler Backend .vhdl Synthesis/Place & Route .class Java Compiler Frontend Java Compiler Backend .vhd Synthesis + Place&Route .class .java
  • 29. 第391回 PTT 2013. 6. 28 ソフトウェアとハードウェアで同じ動作 29 の Java の活用手法の検討 9 図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデ バッグ JVM FPGA 15 connect6 のデバッグで用いたクラスのクラス図 VGAJavaTestSwingFrame VGAIf VGAWrapper Executable as Software JVM FPGA Implement-able onto FPGA monitor vgavga HDL modules SwingCanvas グラフィクス描画ハードウェア設計のためのクラス構造 FTPPlayer.java として Java で実装する. 15 に,Java で実装した connect6 をデバッ る際に利用したクラス群のクラス図を示す. Player と Calculator からなる ICFPT で提 れた connect6 プレイヤは,他の幾つかのプレー 装と共に Player インターフェイスを実装するク である.このクラスのインスタンスは,Game と 図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデ バッグ 図 18 VGA グラフィクス描画ハードウェア 作成した描画対象である SwingFrame をインスタンシ エーションすることで図 17 に示すようにソフトウェ
  • 31. 第391回 PTT 2013. 6. 28 ソースコードレベルでHDLにするので 31 .java Java Compiler Flontend Java Compiler Backend .vhdl Synthesis/Place & Route .class Java Compiler Frontend Java Compiler Backend .java .vhd Synthesis + Place&Route .class
  • 32. 第391回 PTT 2013. 6. 28 Javaのソースコード解析 32 OpenJDK(http://openjdk.java.net)のjavacを活用 コンパイラ本体: com.sun.tools.javac.main.JavaCompiler.java genCode(Env<AttrContext> env, JCClassDecl cdef) ∼ compile(List<JavaFileObject> sourceFileObjects, List<String> classnames, Iterable<? extends Processor> processors)∼ 与えられたソースコードをJavaRockツリーに変換 クラス間の関係の解析,モジュールの結合を決定 最適化 コード生成 コンパイル処理の途中にフックを追加
  • 33. 第391回 PTT 2013. 6. 28 Java構文木をHDL構文木に変換 33 width 変数のビット幅を指定する class var decl method decl var decl block block while for if expr statement var decl continue block return expr ident binary expr unary expr method invocation assign parens expr array access 図 3 Java の構文木の一部 のモジュールにアクセスする Java プログラムをコン パイルできるように,JRHI として,その HDL ライ ブラリの入出力ポートを変数として持つラッパークラ スを Java で記述する.HDL で処理されたモジュール を利用するクラスは,このラッパークラスに宣言され 1: publ 2: pub 3: i 4: f 5: 6: } 7: r 8: } 9: } 図 Java 定義さ と類似 くは直 報処理学会論文誌 May 2007 ンを 変換する る entity signal decl process state machine state machine while for if expr statement continue block return expr ident binary expr unary expr method invocation parens expr array access architecture assign 図 4 JavaRock で扱う VHDL の構文木 (抜粋)
  • 34. 第391回 PTT 2013. 6. 28 生成する基本モジュール 34 Vol. 48 No. 5 FPGA 向け高位合成言語としての sum: entity sum: process clk reset input_port_sum_a_waddr[31:0] input_port_sum_a_wdata[31:0] input_port_sum_a_we[0:0] output_port_sum[31:0] sum_method_busy sum_method_request input_port_sum_a_length notify_method_request notify_method_busy 1 2 3 4 5 6 7 8 9 10 11 12 13 ation r ン イ ラ ル れ り, ラ 図 4 JavaRock で扱う VHDL の構文木 (抜粋) 1: public class sum{ 2: public int sum(int[] a){ 3: int sum = 0; 4: for(int i = 0; i < a.length; i++){ 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求める Java のプログラム Java のクラスを VHDL エンティティに,クラス内で 定義されたメソッドはそのエンティティのプロセスに, と類似する要素に変換できるが,Java の制御構文の多 くは直接 VHDL に変換することはできない.そのた め Java のプログラムと同様のデータ処理を実現する ためのハードウェアアーキテクチャを作る必要がある.
  • 35. 第391回 PTT 2013. 6. 28 コード生成規約: 基本的なストラテジ Javaの1文を1ステートとするステートマシン ブロック文はさらにステートマシンを分割 if,while,for,{} 配列アクセスはBRAMアクセスに分解 35
  • 36. sum: entity sum: process clk reset input_port_sum_a_waddr[31:0] input_port_sum_a_wdata[31:0] input_port_sum_a_we[0:0] output_port_sum[31:0] sum_method_busy sum_method_request input_port_sum_a_length notify_method_request notify_method_busy 図 6 図 5 から生成されるハードウェアアーキテクチャの外観 1: case conv_integer(sum_method_state) is 2: ... 3: when 2 => 4: sum_0 <= conv_std_logic_vector(0, 31-0+1); 5: sum_method_state <= sum_method_state + 1; 6: when 3 => 7: ... 図 7 文のステートマシンへの変換例 ation r ン イ ラ ル れ り, ラ 1: public class sum{ 2: public int sum(int[] a){ 3: int sum = 0; 4: for(int i = 0; i < a.length; i++){ 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求める Java のプログラム Java のクラスを VHDL エンティティに,クラス内で 定義されたメソッドはそのエンティティのプロセスに, と類似する要素に変換できるが,Java の制御構文の多 くは直接 VHDL に変換することはできない.そのた め Java のプログラムと同様のデータ処理を実現する ためのハードウェアアーキテクチャを作る必要がある. ステート変数 上記のJavaコードに相当するステート
  • 37. ation r ン イ ラ ル れ り, ラ 1: public class sum{ 2: public int sum(int[] a){ 3: int sum = 0; 4: for(int i = 0; i < a.length; i++){ 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求める Java のプログラム Java のクラスを VHDL エンティティに,クラス内で 定義されたメソッドはそのエンティティのプロセスに, と類似する要素に変換できるが,Java の制御構文の多 くは直接 VHDL に変換することはできない.そのた め Java のプログラムと同様のデータ処理を実現する ためのハードウェアアーキテクチャを作る必要がある. 長くなるので次のスライドへ
  • 38. ての Java の活用手法の検討 5 1: case conv_integer(sum_method_state) is 2: ... 3: when 3 => 4: case conv_integer(state_counter_sum_1) is 5: when 0 => 6: i_1 <= conv_std_logic_vector(0, 31-0+1); 7: state_counter_sum_1 <= state_counter_sum_1 + 1; 8: when 1 => 9: if (conv_integer(i_1) < input_port_sum_a_length) then 10: state_counter_sum_1 <= state_counter_sum_1 + 1; 11: else 12: sum_method_state <= sum_method_state + 1; 13: state_counter_sum_1 <= (others => ’0’); 14: end if; 15: when 2 => 16: ... 17: when 3 => 18: i_1 <= conv_std_logic_vector(conv_integer(i_1 + 1), 31-0+1); 19: state_counter_sum_1 <= conv_std_logic_vector(1, 32); 20: when others => state_counter_sum_1 <= (others => ’0’); 21: end case; 22: when 4 => 23: ... int sum = 0; for(int i = 0; i < a.length; i++){ sum += a[i]; } return sum; } 図 5 与えられた配列の合計値を求める Java のプ va のクラスを VHDL エンティティに,ク 義されたメソッドはそのエンティティのプ 類似する要素に変換できるが,Java の制御 assign parens expr array access 部 ログラムをコン ,その HDL ライ 持つラッパークラ されたモジュール クラスに宣言され 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列 Java のクラスを VH 定義されたメソッド と類似する要素に変 くは直接 VHDL に ステート変数 このforループのステート変数 init式cond式 update式
  • 39. ation r ン イ ラ ル れ り, ラ 1: public class sum{ 2: public int sum(int[] a){ 3: int sum = 0; 4: for(int i = 0; i < a.length; i++){ 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求める Java のプログラム Java のクラスを VHDL エンティティに,クラス内で 定義されたメソッドはそのエンティティのプロセスに, と類似する要素に変換できるが,Java の制御構文の多 くは直接 VHDL に変換することはできない.そのた め Java のプログラムと同様のデータ処理を実現する ためのハードウェアアーキテクチャを作る必要がある. これも,長くなるので次のスライドへ
  • 40. 1: when 2 => 2: case conv_integer(state_counter_sum_2) is 3: when 0 => 4: case conv_integer(array_index_operation_state_counter_3) is 5: when 0 => 6: param_input_port_sum_a_raddr <= conv_std_logic_vector(conv_integer(i_1), 11-1-0+1); 7: array_index_operation_state_counter_3 <= array_index_operation_state_counter_3 + 1; 8: when 1 => 9: array_index_operation_state_counter_3 <= (others => ’0’); 10: state_counter_sum_2 <= state_counter_sum_2 + 1; 11: when others => array_index_operation_state_counter_3 <= (others => ’0’); 12: end case; 13: when 1 => 14: sum_0 <= conv_std_logic_vector( conv_integer(sum_0 + param_input_port_sum_a_rdata), 31-0+1); 15: state_counter_sum_1 <= state_counter_sum_1 + 1; 16: state_counter_sum_2 <= (others => ’0’); 17: when others => state_counter_sum_2 <= (others => ’0’); 18: end case; 19: when 3 => 20: ... for(int i = 0; i < a.length; i++){ sum += a[i]; } return sum; 図 5 与えられた配列の合計値を求める Java のプロ a のクラスを VHDL エンティティに,ク 義されたメソッドはそのエンティティのプロ 類似する要素に変換できるが,Java の制御 は直接 VHDL に変換することはできない メモリアクセスのステート変数 読むアドレスを指定 1サイクル待たないといけない データを読んでsumに加算
  • 41. 第391回 PTT 2013. 6. 28 コード生成規約: メソッド呼び出し 41 Java こういう枠にはめる. public class Hoge{ // メソッド定義 public int zero(){ return 0; } Hoge hoge = new Hoge(); ... hoge.zero(); // メソッド呼出し timecalleecaller _req <= ’1’ _req <= ’0’ _busy <= ’1’ _busy <= ’0’ set parameters wait for method execution method execution 呼ぶ側 呼ばれる側
  • 42. ation r ン イ ラ ル れ り, ラ 1: public class sum{ 2: public int sum(int[] a){ 3: int sum = 0; 4: for(int i = 0; i < a.length; i++){ 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求める Java のプログラム Java のクラスを VHDL エンティティに,クラス内で 定義されたメソッドはそのエンティティのプロセスに, と類似する要素に変換できるが,Java の制御構文の多 くは直接 VHDL に変換することはできない.そのた め Java のプログラムと同様のデータ処理を実現する ためのハードウェアアーキテクチャを作る必要がある. これも,長くなるので次のスライドへ
  • 43. 1: case conv_integer(sum_method_state) is 2: when 0 => 3: if(sum_method_request = ’1’) then 4: sum_method_busy <= ’1’; 5: sum_method_state <= sum_method_state + 1; 6: else 7: sum_method_busy <= ’0’; 8: end if; 9: when 1 => 10: if(sum_method_request = ’0’) then 11: sum_method_state <= sum_method_state + 1; 12: end if; 13: when 2 => 14: ... 15: when 4 => 16: output_port_sum <= conv_std_logic_vector(conv_integer(sum_0), 31-0+1); 17: sum_method_state <= (others => ’0’); 15: when 5 => 16: sum_method_busy <= ’0’; 17: sum_method_state <= (others => ’0’); 18: when others => sum_method_state <= (others => ’0’); 19: end case; class sum{ c int sum(int[] a){ sum = 0; (int i = 0; i < a.length; i++){ um += a[i]; urn sum; 与えられた配列の合計値を求める Java のプログ のクラスを VHDL エンティティに,クラ れたメソッドはそのエンティティのプロセ xpr ss コン ライ クラ ール され 5: sum += a[i]; 6: } 7: return sum; 8: } 9: } 図 5 与えられた配列の合計値を求め Java のクラスを VHDL エンテ 定義されたメソッドはそのエンテ と類似する要素に変換できるが, くは直接 VHDL に変換すること メソッドが呼び出されるのを待つ この間にパラメタを引き渡す 終わったら,返戻値をセットしておしまい
  • 45. 第391回 PTT 2013. 6. 28 FPGAを 活用 するために 並列化 細粒度自動並列化 ユーザによるThreadレベル並列化 HDLモジュールの利用 JavaRock Hardware Interface(JRHI) JavaRock HDL 45
  • 46. 第391回 PTT 2013. 6. 28 並列化手法 演算レベルの並列性  →基本ブロック内の自動並列化 タスク・データレベルの並列性  →JavaのスレッドをHWにマッピング パイプライン並列性  →wait-notifyで記述  →JavaRock HDLでの記述 46
  • 47. 第391回 PTT 2013. 6. 28 JavaのスレッドをHWにマッピング 47 timecalleecaller _req <= ’1’ _req <= ’0’ _busy <= ’1’ _busy <= ’0’ set parameters wait for method execution method execution スレッドの生成 & 実行 startではメソッドの 終了を待たない
  • 48. 第391回 PTT 2013. 6. 28 HDLモジュールの活用 48 IPコア,手書きHDLモジュールの活用 ハードウェアを意識したJavaコード記述支援 Java JRHI VHDL, Verilog, FPGA Javaで書けない(書きにくい) モジュール JavaとRTLの間を埋める JavaRock HDL
  • 49. 第391回 PTT 2013. 6. 28 JavaRock Hardware Interface 49 VHDL/Verilogで記述したモジュールを使いたい Javaからみて自然な形でアクセスしたい Javaプログラム中に変な記述をいれたくない VHDL/Verilogモジュールの入出力をJavaの変数 HDL中で定義したブロックRAMを配列にみせる
  • 50. 第391回 PTT 2013. 6. 28 JRHIの使いどころ 50 メモリ グラフィクスコントローラ  →制御タイミングが重要 FPGA内部の専用HWリソース  →BlockRAM(内蔵メモリ)  →DSP 既存のHDLコードの活用
  • 51. 第391回 PTT 2013. 6. 28 JavaRock Hardware Interface 51 使いたいHDLモジュール JRHIクラス
  • 52. 第391回 PTT 2013. 6. 28 JRHIの利用 52 public class SC1602_USER{ private final SC1602Wrapper obj = new SC1602Wrapper(); public void put(){ obj.pWrData = (byte) a ; obj.pWrAddr = 0; obj.pWrWr = true; obj.pWrWr = false; obj.pReq = true; obj.pReq = false; } Javaプログラムとしてコンパイルが可能 JavaRockでHDLなsc1602_wrapperと 組み合わせる
  • 53. 第391回 PTT 2013. 6. 28 もう一歩すすんだJRHIの活用 53 public class MemoryDevice extends ∼{ public byte[] byte_data; public int[] int_data; public MemoryDevice(String... args){ super( memory , args); public class MemoryDevice_USER{ private final MemoryDevice obj = new MemoryDevice(); public void put(){ obj.byte_data[0] = (byte)100; obj.int_data[0] = 1000; } ヒープメモリの一部をHDLモジュール内の メモリに見せるというような使い方が可能
  • 54. 第391回 PTT 2013. 6. 28 JavaRock HDL 54 アノテーションによるJavaのHDL化
  • 55. 第391回 PTT 2013. 6. 28 アノテーション 55 アノテーション 概要 対象 @javarockhdl このクラスがJavaRockHDLであることを示す クラス @raw メソッド内のifやwhileの条件判定式をHDLに直接変換 メソッド @auto メソッドが呼び出されることなく動作するようにする メソッド @width 変数のbit幅を定義する 変数 @no_wait メソッド終了を待たずメソッド呼出し元の処理を進める メソッド
  • 56. 第391回 PTT 2013. 6. 28 JavaRockの制限 インスタンスはファイナルでの生成のみ スタティックなHWモジュールとして合成 インスタンスの共有は不可 管理用の信号のアービトレーション未実装 浮動小数点数演算は不可 配列はプリミティブ型(除float/double)のみ /とか%とか未サポート 56
  • 57. 第391回 PTT 2013. 6. 28 適用事例 1/5 57 はじめてのFPGAプログラミング (by 村主さん) http://d.hatena.ne.jp/nushio/20120708 約半日の成果
  • 58. 第391回 PTT 2013. 6. 28 制御分野にFPGAを導入したい 電気自動車の制御 < 50μ秒 3.8m秒@H8 → 6.3μ秒@FPGA 適用事例 2/5 58 倒立振子 (by 宇都宮大学 大川先生) 今後の課題 • FPGA倒立振子ロボットを完成させる • モジュールの結合テスト • モジュールを結合したうえでの 並列化 • 倒立振子の制御動作を確認 FPGA 倒立振子 マイコン 倒立振子 評価結果(平均化処理) 経過時間(マイクロ秒) 平均化処理にマイコンで1.5ミリ秒かかっていたのが FPGAで2.9マイクロ秒に短縮 2013/3/7 第75回全国大会 15 2.88 11.7 22.68 0 5 10 15 20 25 10要素 50要素 100要素 植竹 他 "倒立振子ロボットのFPGAを用いた超高速制御" 情報処理学会第75回全国大会
  • 59. 第391回 PTT 2013. 6. 28 SHA-1 エッジ検出(3x3ラプラシアンフィルタ) 適用事例 3/5 59 Reconfigurable Android (by 農工大 中條研) Vol.53 No.2 1–9 (Feb. 2012) ck b Thread hod call of JavaRock b parallel processing 10 Application Reference Platform for Image Proce (Atom Z530 1.6GHz) (XC6SLX45T) a A k Table 5 Performance comparison in edge detection [MHz] JavaRock 178 61439 153 4096 6 SHA-1 Table 6 Execution time of SHA-1 [ms] Java 3360 Andoird NDK 51.7 FPGA 41.3 FPGA JavaRock 209 1 64 64 CPU FPGA SHA-1 1Mbyte 512 512 Android Java NDK C SHA-1 6 7 Vol.53 No.2 1–9 (Feb. 2012) 7 Table 7 Execution time of edge detection [ms] Java 392 Andoird NDK 8.85 FPGA 8.83 FPGA JavaRock 105 6.1 JavaRock [1] Java JavaRock jar boolean A; private void func0 (){ A = true; } private void func1 (){ A = false; } 11 1 Fig. 11 Writing a variable from mul
  • 60. 第391回 PTT 2013. 6. 28 適用事例 4/5 60 ハードウェアシステムのコンソールなど 文字列処理 “192.168.10.1” → 0xc0, 0xa8, 0x0a, 0x01
  • 61. 第391回 PTT 2013. 6. 28 Networked FPGA system based on ORB 適用事例 5/5 61 ORB Engine with JavaRock T. Ohkawa et al., "Reconfigurable and Hardwired ORB Engine on FPGA by Java- to-HDL Synthesizer for Realtime Application," Proc. 4th International Symposium on Highly Efficient Accelerators and Reconfigurable Technologies (HEART 2013), June 2013. hand-coded primitive protocol. It is efficient and high- speed, however, difficult to develop complex system and hard to maintain. It is shown that the overhead of ORB protocol processing compared to RAW protocol system is very small (about 70us). The system clock frequency of the FPGA is 50MHz. As compared to the software ORB on MicroBlaze soft-core processor shown in Figure 5, the latency time was reduced dramatically (from 1.5ms to 200 us, @ 50MHz). 0 200 400 600 800 1000 1 2 3 4 5 Delay[us] Remote Calls ORB (PC) ORB (FPGA) Raw (PC) Raw (FPGA) Figure 11 Measurement performance of the synthesized ORB Protocol Engine compared to RAW protocol system 0 2000 4000 6000 0 20 40 60 torOutput e)andangle(Frame) degree] z angle out
  • 67. インスタンスをどう取り扱うか funcを呼ぶ可能性のある箇所を検索 してポインタをたどる? 動的にポインタを切り替えられるよ うな仕組みを作る 67 class A{ B b = new B(); C c = new C(); func(D d){ ... } } b c d0 d1 ? ソフトウェアと同じモデル. ポインタをたどるための機構 がボトルネックになる? 何かしらの アービトレーション機構?
  • 69. 調停機構を考慮したメソッドI/F 69 Vol. 48 No. 5 FPGA 向け高位合成言語としての Java の sum: entity sum: process clk reset input_port_sum_a_waddr[31:0] input_port_sum_a_wdata[31:0] input_port_sum_a_we[0:0] output_port_sum[31:0] sum_method_busy sum_method_request input_port_sum_a_length notify_method_request notify_method_busy 図 6 図 5 から生成されるハードウェアアーキテクチャの外観 1: case conv_integer(sum_method_state) is 2: ... 3: when 2 => 4: sum_0 <= conv_std_logic_vector(0, 31-0+1); 5: sum_method_state <= sum_method_state + 1; 6: when 3 => 7: ... 図 7 文のステートマシンへの変換例 1: case conv_ 2: ... 3: when 3 = 4: case c 5: when 6: i_ 7: st 8: when 9: if 10: 11: el 12: 13: 14: en 15: when 16: 17: when 18: 19: 20: when 21: end ca 22: when 4 = 23: ... 現状のメソッドI/F Ctrl(Req, Ack, Busy) Input params Return value 新しいメソッドI/F モジュール同士が密結合になる - どんなモジュールでも統一のI/FでOK!!
  • 70. メソッド呼び出し 70 Req(Callee ID) Ack(Caller ID) Method ID Method ID #. of Args #. of Args Arg 0 Arg 0 Arg n Arg n Caller Instance Callee InstanceArbiter Done Done
  • 71. メソッド呼び出し Instance ID: 各インスタンスに静的に付与 Method ID: 各メソッドに静的に付与 Req/Ack: アクセスを許可したインスタンスIDを出力 インスタンス毎に1メソッドずつしか呼べない Args: 即値は値渡し,インスタンス/配列はID渡し 71
  • 74. 継承 静的に親クラスのメソッドを追加する Objectにあるメソッド clone(), equals(), finalize(), getClass(), hashCode(), notify(), notifyAll(), toString(), wait(), wait(long timeout), wait(long timeout, int nanos)に対応 74
  • 75. 例外 現状では対応していない(無視する) 遷移: return同様の大域脱出 new XXException()は無理 final なXXExceptionを投げる インスタンスのやり取りができれば解決 75
  • 77. コンパイルパスの整理 1. クラスのリストアップ 2. 各クラスのエンティティを生成 3. インスタンスの関係情報を構築 4. Arbiter,トップエンティティの生成 5. 各クラスのアーキテクチャ生成 6. VHDLとして出力 77
  • 78. その他 式の分解/組み立てをまじめに実装する a = b = c; みたいなものが扱えるように a[i++] が扱えるように (a + b) >> 8 が扱えるように(functionの活用?) JavaRockHDLの整理 ライブラリの整理 Thread(Runnable obj)が使えるように 78
  • 79. その他(2) GUI(JavaRock.Pop)なコード生成ツール AXIやQsysへの乗り入れ newによる動的な回路生成??/GC?? JavaRockという名前は問題?? 79 AXI Main Logic generated by JavaRock Main Logic generated by VHDL/Verilog Central Direct Memory Access Controller DDR3 PCIe Controller ロジック ロジック DMA DDR3 PCIe