SlideShare a Scribd company logo
1 of 33
Download to read offline
JavaRockで
BlokusDuoプレーヤを作る話
三好 健文
@miyox
株式会社イーツリーズ・ジャパン
1
いつもの,前置き
FPGAとは
3
論理回路・データパスを自由に作り込める
クロックレベルの同期と並列性の活用
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月号より
FPGAの活用シーン
4
独自の回路を実現できるハードウェア
特定の処理を低消費電力で高性能処理
デバイスに近い処理を簡単に実現
自由なI/Oポートの定義
ASIC開発のプロトタイプとして
特定用途向け少数生産の製品として
例) freeocean
5
最大スループット: 1Gbps
最大同時処理コネクション数: 50万
秒間同時接続数: 約2万HTTPリクエスト
最大消費電力: 300W以下
ハードウェアWebキャッシュサーバ
ここから,今日の本題
.java%
Java %
.vhdl%
Java %
/
JavaRock%
JVM%
JavaRockやってます
7
JavaRockの目指すところ
JavaプログラムをそのままHDLに変換→FPGA上のHWにする
追加構文,データ型は導入しない
記述に制限は加える
HDLで書けることをJavaで書けるようにする ではない
Javaで書けることを全部HDLにする ではない
http://javarock.sourceforge.net/
FPGAの開発手法の主役
8
HDL(Hardware Description Language)
によるRTL(Register Transfer Level)設計
+
>
a
b
x
y
f
g
h
counter+1
clk
FPGA上のプログラミングとは
9
論理回路構成要素の演算内容を決める
論理回路構成要素同士をどう接続するかを決める
cf. http://commons.wikimedia.org/wiki/File:Two_women_operating_ENIAC_(full_resolution).jpg
HDLによる設計のメリット/デメリット
10
ロジックを抽象化した式/構文で設計できる
クロックレベルのデータ制御
細粒度の並列性の活用
状態 を自分で管理しなければいけない
デバッグ/動作検証が難しい
アルゴリズムを設計するには記述が煩雑
メリット
デメリット
HDLによる設計のデメリットを克服する方法
11
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
HDLによる設計のデメリットを克服する方法
12
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
環境/ソース保守コストの増大
HDLによる設計のデメリットを克服する方法
13
FPGAとは別にプロセッサを持ってくる
FPGAの中にプロセッサを作る
より抽象度の高い設計をする
FPGAを使うのをやめる
高位合成言語/処理系の活用
高位合成言語/処理系に何を求めるか
記述コストの軽減
高い抽象度の表現方法を利用したい
言語習得のコストは低く抑えたい
動作検証/デバッグコストの軽減
短時間で動作を確認したい
見通しよく手軽なデバッグをしたい
FPGAのパフォーマンスの活用
粗粒度,細粒度の並列性を活用したい
IPコア,FPGA内蔵機能を活用したい
14
沢山の高位合成言語/処理系
15
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]
た言語および言語処理系では,高水準言語の機能を
用いて記述された部分とハードウェア化の対象とな
また,オブジェクト指向言語において,クラスのイ
ンスタンスの動的な生成を実現するのは困難である.
沢山の高位合成言語/処理系(設計方針別)
16
タイプ1: 既存の言語を活用したHDL(文法.型の導入)
タイプ2: 既存の言語をそのままHWに
タイプ3: 抽象度の高い新しいHDL
コンパイラでがんばる
FPGAをどう活用するか,が
洗練されていて素敵!!
型?型クラス? レジスタ? 高階関数
既存の言語に文法,型を導入
馴染みの文法でハードウェア記述ができる
デバッグに時間がかかる(RTL/TLMでシミュレーション)
沢山の高位合成言語/処理系(設計方針別)
17
タイプ1: 既存の言語を活用したHDL(文法.型の導入)
タイプ2: 既存の言語をそのままHWに
タイプ3: 抽象度の高い新しいHDL
コンパイラでがんばる
FPGAをどう活用するか,が
洗練されていて素敵!!
型?型クラス? レジスタ? 高階関数
既存の言語に文法,型を導入
馴染みの文法でハードウェア記述ができる
デバッグに時間がかかる(RTL/TLMでシミュレーション)
高位合成処理系 入力言語として見たJava
18
クラスによるオブジェクト指向設計         
←HWのモジュール設計との親和性が高そう
Threadやwait-notify,synchronizedの仕組み       
←言語仕様内で並列性の記述ができそう
明示的なポインタを扱う必要がない        
←言語の想定するメモリ構造から自由になれそう
動的な振る舞いがたくさんある          
←HW化するのは厄介そう
コンパイラでがんばれるか?
第391回 PTT 2013. 6. 28
JavaRockの現状
JavaプログラムをそのままHW化する
追加構文,データ型は導入しない
記述に制限は加える(できないものはできない)
プログラムカウンタをステートマシンに置換
基本1文1状態 ← 基本ブロック内の並列化くらい
制御構造に対応するステートマシンの入れ子
メソッド呼び出し相当のHDLコード生成
Threadによる並列処理記述
いくつかの都合の良いアノテーション
19
今日のお品書き
JavaRockってこんな感じ
BlokusDuoプレーヤ作ってます(...のはず)
20
はじめてのJavaRock
LEDをチカチカする
シリアルでエコーバック
ボタンを押したら何か(LED反転)
21
LEDチカチカ
ゆっくり明るくして,ゆっくり暗くして
22
PERIOD時間かけてゆっくり明るくする:
for i in 0..PERIOD-1
 LEDを点灯する
 (i * 単位時間) 待つ
 LEDを消灯する
 (PERIDO-i * 単位時間) 待つ
}
たとえば,↓な感じです.
Javaで書くと...
23
public class Firefly extends Thread{
public boolean flag = false;
private final static int PERIOD = 500;
private final static int SLEEP_WEIGHT = 256;
private void sleep(int v){ for(int k = 0; k < (v * SLEEP_WEIGHT); k++){ ; } }
public void run(){
while(true){
for(int i = 0; i < PERIOD; i++){
flag = true; sleep(i);
flag = false; sleep(PERIOD-i);
}
for(int i = 0; i < PERIOD; i++){
flag = true; sleep(PERIOD-i);
flag = false; sleep(i);
}
sleep(1);
sleep(1);
}
}
}
トップでインスタンス生成/実行
24
import net.wasamon.javarock.rt.*;
@javarockhdl
public class test{
private final Firefly obj0 = new Firefly();
private final echo obj1 = new echo();
private final MemoriedButton obj2 = new MemoriedButton();
public boolean flag;
public boolean btn_out;
@auto
public void main(){
obj0.start();
obj1.start();
obj2.start();
while(true){
flag = obj0.flag;
btn_out = obj2.flag;
}
}
}
デモ
BlokusDuoプレーヤを作ろう!!
1∼5個の正方形によるコマを使う
2人のプレーヤが交互に打ち合う
打てる場所は
自分のコマと辺を共有しない
自分のコマと頂点を共有する
余った正方形数が多い方が負け
いくつかボーナスポイントがある
26
何が必要か
手をやりとするプロトコルのやりとり
コンテストの場合UARTを使う
手のエンコード/デコード
間違ったところに置かない
勝てるようなところに置いていく
27
BlokusDuoプレーヤ
28
SimplePlayer BlokusBoard
+ init
+ setTurnCode
+ setOpponentMove
+ getFirstMoveCode
+ getNextMove
+ init
+ get(x, y)
+ byte getSym()
+ isValid(x, y, c, id, rot)
+ move(x, y, c, id, rot)
board
プレーヤとしての思考ルーチン 盤面の管理/合法手の判定
GameAgent
プロトコル処理/手のやりとり
player
IO
すごーく単純な戦略の場合
29
private int getNextMove1(){
int code = 0;
while(true){
if(nextId < 0){ break; } // もうコマが残ってないからあきらめ
for(int i = 0; i < COLS; i++){ // 左の
for(int j = 0; j < ROWS; j++){ // 一番上から
for(int k = 0; k < 8; k++){ // コマを回転させつつ
if(board.isValid(COLS - i - 1, ROWS - j - 1, myColor, nextId, k) == true){ // 置ける?
// 置けるなら置いちゃう!!
board.move(COLS - i - 1, ROWS - j - 1, myColor, nextId, k); // 自分の盤を更新
code = encode(COLS - i -1, ROWS - j - 1, nextId, k); // 相手に通知するため
nextId = nextId - 1; // 次回は次のコマから
return code;
}
}
}
}
nextId = nextId - 1; // 今のコマは諦めて次のコマを試す.
}
return -1;
}
JavaRockを使うメリット
ややこしいコードはJavaの方が楽
SimplePlayer,BlokusBoardみたいなHWに
関係ないコードはSWとして実行可能
30
→ SW上でアルゴリズムの素性を手軽にチェック
→ v.s HDLで
「いやX言語の方が」...もあるでしょうけど
デモ
勘違いして欲しくないこと
32
JavaだけでFPGAが活用できるわけがないじゃない!!
AXI
Main Logic
generated by JavaRock
Main Logic
generated by VHDL/Verilog
Central
Direct Memory Access Controller
DDR3
PCIe Controller
ロジック
ロジック
DMA
DDR3
PCIe
AXI
VHDL/Verilogで書いたモジュールを埋め込み可能
JavaRockで書いたモジュールをVHDL/Verilogな
モジュールにつなぐことも
→私もそう思います...
まとめなど
JavaRockの紹介をしました
JavaRockでBlokusDuoプレーヤ作ってます
アルゴリズムに手がまわってない
9/20が申し込み締め切り(ICFPT併設コンペ)
http://javarock.sourceforge.net/
http://www.slideshare.net/miyox/ptt391
33
JavaRock関連URL
http://lut.eee.u-ryukyu.ac.jp/dc13/index.html

More Related Content

What's hot

エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
 
いいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primerいいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primer
Yuto Hayamizu
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 

What's hot (20)

Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
いいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primerいいかげんな人のためのTransactional Memory Primer
いいかげんな人のためのTransactional Memory Primer
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
Slide
SlideSlide
Slide
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 

More from Takefumi MIYOSHI

More from Takefumi MIYOSHI (20)

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
 
Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)Abstracts of FPGA2017 papers (Temporary Version)
Abstracts of FPGA2017 papers (Temporary Version)
 
Hls friends 20161122.key
Hls friends 20161122.keyHls friends 20161122.key
Hls friends 20161122.key
 
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
 
Microblaze loader
Microblaze loaderMicroblaze loader
Microblaze loader
 
Reconf 201506
Reconf 201506Reconf 201506
Reconf 201506
 
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
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 

Fpgax 20130830