SlideShare a Scribd company logo
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

KEY
core dumpでcode golf
PPTX
Sharing Deep Dive
PDF
SEH on mingw32
PDF
Visual C++コード分析を支えるSAL
PDF
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
PDF
C++ Transactional Memory言語拡張の紹介
PDF
Effective modern-c++#9
PDF
constexpr idioms
core dumpでcode golf
Sharing Deep Dive
SEH on mingw32
Visual C++コード分析を支えるSAL
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
C++ Transactional Memory言語拡張の紹介
Effective modern-c++#9
constexpr idioms

What's hot (20)

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

More from Takefumi MIYOSHI (20)

PDF
ACRi_webinar_20220118_miyo
PDF
DAS_202109
PDF
ACRiルーム1年間の活動と 新たな取り組み
PDF
RISC-V introduction for SIG SDR in CQ 2019.07.29
PDF
Misc for edge_devices_with_fpga
PDF
Cq off 20190718
PDF
Synthesijer - HLS frineds 20190511
PDF
Reconf 201901
PDF
Hls friends 201803.key
PPTX
Abstracts of FPGA2017 papers (Temporary Version)
PDF
Hls friends 20161122.key
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
PDF
Microblaze loader
PDF
Reconf 201506
PDF
Synthesijer jjug 201504_01
PDF
Synthesijer zynq qs_20150316
PDF
Synthesijer fpgax 20150201
PDF
Synthesijer hls 20150116
PDF
Synthesijer.Scala (PROSYM 2015)
ACRi_webinar_20220118_miyo
DAS_202109
ACRiルーム1年間の活動と 新たな取り組み
RISC-V introduction for SIG SDR in CQ 2019.07.29
Misc for edge_devices_with_fpga
Cq off 20190718
Synthesijer - HLS frineds 20190511
Reconf 201901
Hls friends 201803.key
Abstracts of FPGA2017 papers (Temporary Version)
Hls friends 20161122.key
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Microblaze loader
Reconf 201506
Synthesijer jjug 201504_01
Synthesijer zynq qs_20150316
Synthesijer fpgax 20150201
Synthesijer hls 20150116
Synthesijer.Scala (PROSYM 2015)
Ad

Fpgax 20130830