fpgax 20130830

33
JavaRockで BlokusDuoプレーヤを作る話 三好 健文 @miyox 株式会社イーツリーズ・ジャパン 1

Upload: takefumi-miyoshi

Post on 30-Jun-2015

2.587 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Fpgax 20130830

JavaRockでBlokusDuoプレーヤを作る話

三好 健文@miyox

株式会社イーツリーズ・ジャパン

1

Page 2: Fpgax 20130830

いつもの,前置き

Page 3: Fpgax 20130830

FPGAとは

3

論理回路・データパスを自由に作り込めるクロックレベルの同期と並列性の活用

Field Programmable Gate Array

73Feb. 2011 KEYWORD Bluespec Sytem Verilog,高位合成言語

HDLがドレスを着たお姫さまだとすると,コンパイル時にエラーをしっかり検出してくれるが故にコンパイルを通すのが困難な反面,コンパイルさえ通れば合成した回路がきちんと動作してくれるBluespecはパワフルなツンデレ娘と筆者はイメージしています(図2).

 Verilog HDLやVHDLを使った設計で,― あぁ~,数字って32ビットだった.うっかりキャストされていたよ…

― テスト・ベンチのステート・マシンを書くのが面倒だな.― モジュールのインスタンシーエーションで入出力ピンをつなぎ忘れていた

という思いをしたことはありませんか? 単純な記述の羅列や細かいミスへの注力が続くと,本来力を入れるべき,アーキテクチャの設計まで億

おっくう

劫になってしまいます.また,「コンパイル(論理合成)は通るのに,シミュレーションやFPGA上で動作させると,何かおかしい」という事態に頭を悩ませ,原因はうっかりミスだったということも一度や二度ではないと思います. 記述の手間がもっと省けて,コンパイル時に強力にエラー・チェックしてくれるHDL言語ないかなあ…という要求に応えてくれるのがBluespec System Verilogです(図1).VHDLがまじめなキャリア・ウーマン,Verilog

...a<={data, 10};...

;case 100; next<=101;case 101; if .... then next<=105; else nex<= 102; . . .

FPGA

実機合成・配置配線

ステート・マシン

BSVなら“型チェック”でコンパイル・エラー BSVのStmt FSMで簡単に書けるよ♪

うまく動かないよー

たくさん書くの疲れるよー

◀図1 Bluespec System Verilog(BSV)で安全,らくらくハードウェア開発

▲ 図2 Bluespec System Verilogは ツンデレ娘きっちりしていてキャリアも長いVHDL,あいまいさが許容されるのがVerilog HDL,コンパイル時にしっかりエラーを検出し,その後,素直に動くのがBluespec System Verilog.

新世代のESL合成ソリューション Bluespec System Verilogのすすめ

高位設計言語で複雑な回路もらくらく設計

 本章では,高位設計言語であるBluespec System Verilogを紹介する.この言語では,コンパイル時にしっかりエラー検出ができ,また,さまざまなライブラリも提供している.FPGAやASICが大規模化し複雑な回路を設計する機会が増えてきた今,知っておくべき技術だろう. (編集部) 三好 健文

第3章

出典: CQ出版 Interface 2011年2月号より

Page 4: Fpgax 20130830

FPGAの活用シーン

4

独自の回路を実現できるハードウェア

特定の処理を低消費電力で高性能処理

デバイスに近い処理を簡単に実現

自由なI/Oポートの定義

ASIC開発のプロトタイプとして

特定用途向け少数生産の製品として

Page 5: Fpgax 20130830

例) freeocean

5

最大スループット: 1Gbps

最大同時処理コネクション数: 50万

秒間同時接続数: 約2万HTTPリクエスト

最大消費電力: 300W以下

ハードウェアWebキャッシュサーバ

Page 6: Fpgax 20130830

ここから,今日の本題

Page 7: Fpgax 20130830

.java%

Java����%������

.vhdl%

Java����%�������

��/������JavaRock%��� ��

JVM%

JavaRockやってます

7

JavaRockの目指すところJavaプログラムをそのままHDLに変換→FPGA上のHWにする

追加構文,データ型は導入しない記述に制限は加える

“HDLで書けることをJavaで書けるようにする”ではない

“Javaで書けることを全部HDLにする”ではない

http://javarock.sourceforge.net/

Page 8: Fpgax 20130830

FPGAの開発手法の主役

8

HDL(Hardware Description Language)によるRTL(Register Transfer Level)設計

+×>

ab

xy

f

g

h

counter+1

clk

Page 9: Fpgax 20130830

FPGA上のプログラミングとは

9

論理回路構成要素の演算内容を決める論理回路構成要素同士をどう接続するかを決める

cf. http://commons.wikimedia.org/wiki/File:Two_women_operating_ENIAC_(full_resolution).jpg

Page 10: Fpgax 20130830

HDLによる設計のメリット/デメリット

10

ロジックを抽象化した式/構文で設計できる

クロックレベルのデータ制御

細粒度の並列性の活用

“状態”を自分で管理しなければいけない

デバッグ/動作検証が難しい

アルゴリズムを設計するには記述が煩雑

メリット

デメリット

Page 11: Fpgax 20130830

HDLによる設計のデメリットを克服する方法

11

FPGAとは別にプロセッサを持ってくる

FPGAの中にプロセッサを作る

より抽象度の高い設計をする

FPGAを使うのをやめる

高位合成言語/処理系の活用

Page 12: Fpgax 20130830

HDLによる設計のデメリットを克服する方法

12

FPGAとは別にプロセッサを持ってくる

FPGAの中にプロセッサを作る

より抽象度の高い設計をする

FPGAを使うのをやめる

高位合成言語/処理系の活用

環境/ソース保守

コストの増大

Page 13: Fpgax 20130830

HDLによる設計のデメリットを克服する方法

13

FPGAとは別にプロセッサを持ってくる

FPGAの中にプロセッサを作る

より抽象度の高い設計をする

FPGAを使うのをやめる

高位合成言語/処理系の活用

Page 14: Fpgax 20130830

高位合成言語/処理系に何を求めるか記述コストの軽減高い抽象度の表現方法を利用したい言語習得のコストは低く抑えたい

動作検証/デバッグコストの軽減短時間で動作を確認したい見通しよく手軽なデバッグをしたい

FPGAのパフォーマンスの活用粗粒度,細粒度の並列性を活用したいIPコア,FPGA内蔵機能を活用したい

14

Page 15: Fpgax 20130830

沢山の高位合成言語/処理系

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]

た言語および言語処理系では,高水準言語の機能を用いて記述された部分とハードウェア化の対象となる部分のコードを混在させることができない.また,ハードウェアとしてビット幅や並列性を明示的に指示した箇所のコードはソフトウェアとして実行することができない.そのため,処理の検証には動作のシミュレーションが必要となる.すなわち,単にソフトウェアをプログラムとして実行した場合に比べて検証時間が長大になる,あるいは,検証に使える手段が限られることで動作検証やデバッグにかかるコストが大きくなるいう問題は残る.

3. 2 言語機能の制限ベースとした言語の持つ機能のうち,ハードウェア

上に構成が難しい,あるいは必要以上に実装のコストが大きい機能は,その使用に対する制限が加えられている.たとえば,C では,ポインタ演算が可能であるが,どのようにハードウェアにマッピングするかは一つの実装上の課題となる.多くの言語でポインタ演算やポインタ変数の使用には制限があるか,独自にハードウェアの動作に対応づけている.Cyber

Workbench [36]や AutoESL [37]では,コンパイル時にポインタ変数へのアクセスを適切なメモリアクセスや I/Oアクセスに置換する機能を提供している.

また,オブジェクト指向言語において,クラスのインスタンスの動的な生成を実現するのは困難である.そのため,Javaをベースとする高位合成処理系である Sea Cucumber [24]及び JavaRock [25]では,インスタンスの動的生成をサポートしていない.

3. 3 拡張なしの入力を受け付ける処理系第 3. 1 節では,ベースとなる言語を拡張した高位

合成言語について述べた.その一方で,CyberWork-

Bench [36],AutoESL [37]や LegUp [38]は,拡張のない ANSI-Cを入力として受けつけられる処理系である.Javaベースの Sea Cucumber [24],JavaRock [25]

や Lime [22],C#ベースの Kiwi [26] もまた拡張のないベース言語を入力として受け付けられる.これらの高位合成処理系に入力されるプログラム

は,それぞれの言語の一般的なコンパイラでコンパイルすればコンピュータの上でソフトウェアとして動作させることができる.これらは,新たなプログラミング習得の手間なしでプログラムをハードウェアとして実装でき,また,ソフトウェアとしてアルゴリズムレベルでのデバッグが可能になるため,開発の繁雑さが解消される.しかしながら,FPGAの性能を引き出すためには,拡張された記述方法の利用や,変換器の動作を考慮したコードの記述が必要になることも

Page 16: Fpgax 20130830

沢山の高位合成言語/処理系(設計方針別)

16

タイプ1: 既存の言語を活用したHDL(文法.型の導入)

タイプ2: 既存の言語をそのままHWに

タイプ3: 抽象度の高い新しいHDL

コンパイラでがんばるFPGAをどう活用するか,が鍵

洗練されていて素敵!!型?型クラス? レジスタ? 高階関数

既存の言語に文法,型を導入馴染みの文法でハードウェア記述ができるデバッグに時間がかかる(RTL/TLMでシミュレーション)

Page 17: Fpgax 20130830

沢山の高位合成言語/処理系(設計方針別)

17

タイプ1: 既存の言語を活用したHDL(文法.型の導入)

タイプ2: 既存の言語をそのままHWに

タイプ3: 抽象度の高い新しいHDL

コンパイラでがんばるFPGAをどう活用するか,が鍵

洗練されていて素敵!!型?型クラス? レジスタ? 高階関数

既存の言語に文法,型を導入馴染みの文法でハードウェア記述ができるデバッグに時間がかかる(RTL/TLMでシミュレーション)

Page 18: Fpgax 20130830

高位合成処理系 入力言語として見たJava

18

クラスによるオブジェクト指向設計         ←HWのモジュール設計との親和性が高そう

Threadやwait-notify,synchronizedの仕組み       ←言語仕様内で並列性の記述ができそう

明示的なポインタを扱う必要がない        ←言語の想定するメモリ構造から自由になれそう

動的な振る舞いがたくさんある          ←HW化するのは厄介そう

コンパイラでがんばれるか?

Page 19: Fpgax 20130830

第391回 PTT 2013. 6. 28

JavaRockの現状JavaプログラムをそのままHW化する追加構文,データ型は導入しない記述に制限は加える(できないものはできない)プログラムカウンタをステートマシンに置換基本1文1状態 ← 基本ブロック内の並列化くらい制御構造に対応するステートマシンの入れ子メソッド呼び出し相当のHDLコード生成Threadによる並列処理記述いくつかの都合の良いアノテーション

19

Page 20: Fpgax 20130830

今日のお品書きJavaRockってこんな感じ

BlokusDuoプレーヤ作ってます(...のはず)

20

Page 21: Fpgax 20130830

はじめてのJavaRockLEDをチカチカする

シリアルでエコーバック

ボタンを押したら何か(LED反転)

21

Page 22: Fpgax 20130830

LEDチカチカゆっくり明るくして,ゆっくり暗くして

22

PERIOD時間かけてゆっくり明るくする: for i in 0..PERIOD-1 LEDを点灯する (i * 単位時間) 待つ LEDを消灯する (PERIDO-i * 単位時間) 待つ}

たとえば,↓な感じです.

Page 23: Fpgax 20130830

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); } }}

Page 24: Fpgax 20130830

トップでインスタンス生成/実行

24

import net.wasamon.javarock.rt.*;

@javarockhdlpublic 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; } }}

Page 25: Fpgax 20130830

デモ

Page 26: Fpgax 20130830

BlokusDuoプレーヤを作ろう!!

1~5個の正方形によるコマを使う

2人のプレーヤが交互に打ち合う

打てる場所は

自分のコマと辺を共有しない

自分のコマと頂点を共有する

余った正方形数が多い方が負け

いくつかボーナスポイントがある

26

Page 27: Fpgax 20130830

何が必要か手をやりとするプロトコルのやりとり

コンテストの場合UARTを使う

手のエンコード/デコード

間違ったところに置かない

勝てるようなところに置いていく

27

Page 28: Fpgax 20130830

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

Page 29: Fpgax 20130830

すごーく単純な戦略の場合

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; }

Page 30: Fpgax 20130830

JavaRockを使うメリットややこしいコードはJavaの方が楽

SimplePlayer,BlokusBoardみたいなHWに関係ないコードはSWとして実行可能

30

→ SW上でアルゴリズムの素性を手軽にチェック

→ v.s HDLで「いやX言語の方が」...もあるでしょうけど

Page 31: Fpgax 20130830

デモ

Page 32: Fpgax 20130830

勘違いして欲しくないこと

32

JavaだけでFPGAが活用できるわけがないじゃない!!

AXI

Main Logicgenerated by JavaRock

Main Logicgenerated by VHDL/Verilog

CentralDirect Memory Access Controller

DDR3

PCIe Controller

ロジック

ロジック

DMA

DDR3

PCIe

AXI

VHDL/Verilogで書いたモジュールを埋め込み可能

JavaRockで書いたモジュールをVHDL/Verilogなモジュールにつなぐことも

→私もそう思います...

Page 33: Fpgax 20130830

まとめなどJavaRockの紹介をしました

JavaRockでBlokusDuoプレーヤ作ってます

アルゴリズムに手がまわってない

9/20が申し込み締め切り(ICFPT併設コンペ)

http://javarock.sourceforge.net/

http://www.slideshare.net/miyox/ptt391

33

JavaRock関連URLhttp://lut.eee.u-ryukyu.ac.jp/dc13/index.html