fpgax 20130830
TRANSCRIPT
JavaRockでBlokusDuoプレーヤを作る話
三好 健文@miyox
株式会社イーツリーズ・ジャパン
1
いつもの,前置き
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月号より
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)設計
+×>
ab
xy
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]
た言語および言語処理系では,高水準言語の機能を用いて記述された部分とハードウェア化の対象となる部分のコードを混在させることができない.また,ハードウェアとしてビット幅や並列性を明示的に指示した箇所のコードはソフトウェアとして実行することができない.そのため,処理の検証には動作のシミュレーションが必要となる.すなわち,単にソフトウェアをプログラムとして実行した場合に比べて検証時間が長大になる,あるいは,検証に使える手段が限られることで動作検証やデバッグにかかるコストが大きくなるいう問題は残る.
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の性能を引き出すためには,拡張された記述方法の利用や,変換器の動作を考慮したコードの記述が必要になることも
沢山の高位合成言語/処理系(設計方針別)
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
はじめてのJavaRockLEDをチカチカする
シリアルでエコーバック
ボタンを押したら何か(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.*;
@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; } }}
デモ
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 Logicgenerated by JavaRock
Main Logicgenerated by VHDL/Verilog
CentralDirect 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関連URLhttp://lut.eee.u-ryukyu.ac.jp/dc13/index.html