34
計算機としてのFPGAの 基礎知識 三好 健文 株式会社イーツリーズ・ジャパン 1

Google 20130218

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Google 20130218

計算機としてのFPGAの基礎知識

三好 健文株式会社イーツリーズ・ジャパン

1

Page 2: Google 20130218

2012.8.17 @虎ノ門

三好健文 - e-trees. Japan, Inc.

2

東工大→東大→東工大→電通大→現在

コンパイラとかHW/SW協調設計とか囲碁専用ハードウェア

CUDA/MPIコンパイラ

ネットワーク処理の専用ハードウェア化

ストリーム処理専用アーキテクチャ

JavaRock

Page 3: Google 20130218

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: Google 20130218

FPGAの利用シーン独自の回路を実現できるハードウェア

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

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

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

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

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

4

http://www.micron.com/about/news-and-events/events/xfest-2012

http://japan.xilinx.com/products/boards-and-kits/EK-K7-KC705-G.htm

Page 5: Google 20130218

FPGAの利用シーン独自の回路を実現できるハードウェア

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

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

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

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

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

5

あるいは,オリジナルの演算コンポーネントとして

http://www.micron.com/about/news-and-events/events/xfest-2012

http://japan.xilinx.com/products/boards-and-kits/EK-K7-KC705-G.htm

Page 6: Google 20130218

freeocean

6

最大スループット: 1Gbps

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

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

最大消費電力: 約160W

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

http://e-trees.jp/index.php/製品/freeocean/

ちょっと宣伝

Since 2006

Page 7: Google 20130218

freeocean-ng 構想

7

最大スループット: 20Gbps

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

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

最大消費電力: 200W以下

ハードウェアWebキャッシュサーバちょっと相談

Page 8: Google 20130218

“FPGA”に関してよく聞くフレーズ向いてる計算ならGPUやCPUより速いよ

そんなのFPGAなら1クロックでできるし!!

8

Page 9: Google 20130218

“FPGA”に関してよく聞くフレーズ向いてる計算ならGPUやCPUより速いよ

そんなのFPGAなら1クロックでできるし!!

9

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.

Page 10: Google 20130218

“FPGA”に関してよく聞くフレーズ向いてる計算ならGPUやCPUより速いよ

そんなのFPGAなら1クロックでできるし!!

うーん,メモリ少ないんですよね...

浮動小数点数演算はちょっと苦手かも...

10

FPGAの性能に関して,ソフトウェア・アプリ開発者とイメージを共有したい

と,いいながら

Page 11: Google 20130218

で,実際FPGAってどんな素子なの?「それ1クロックで...」の光と影

浮動小数点数演算が苦手?

データの入出力ってどうやるの?

メモリ使えるの?

高位合成言語について

11

Page 12: Google 20130218

「それ1クロックで...」の光と影演算素子を好きにつなげられる

データ移動に関するクロックコストは0

12

Page 13: Google 20130218

「それ1クロックで...」の光と影演算素子/配線を通る時間は0ではない

遠い配線は演算素子で中継されることも

13

δ n秒 δ n秒

δ n秒 δ n秒

δ n秒

δ n秒

クロックを長くしないと安定しない

δ n秒

Page 14: Google 20130218

用途にあわせてクロックを制御するのが技適度にFFを入れてクロックを分割する

パイプライン並列化でスループットの旨味も

14

δ n秒 δ n秒

δ n秒 δ n秒

δ n秒

δ n秒

クロックを長くしないと安定しない

FF

FF

FF

FF FFFF

Page 15: Google 20130218

FPGAの内部はどうなっているのか?

15

Spartan-6 FPGA 䝁䞁䝣 䜱䜼䝱䝤䝹 japan.xilinx.com 9䝻䝆䝑䜽 䝤䝻䝑䜽 䝴䞊䝄䞊 䜺䜲䝗UG384 (v1.0) 2009 ᖺ 6 ᭶ 24 ᪥

X-Ref Target - Figure 3

ᅗ 3 : SLICEM 䛾ᅗ

A6:A1B6:B1

C6:C1

D6:D1

DI

CI

A6:A1

AX

CIN

1

WA6:WA1

BI

CLK

CX

WE

CESR

AI

BX

A6:A1WA6:WA1

A6:A1 O6O5

WA7

DI1

WA8

MC31

CED Q

ug384_03_042309

CK

SR

WA6:WA1

DI2 CLK

CARRY4

COUT

WE

A6:A1WA6:WA1

O6O5

WA7

DI1

WA8

MC31

DI2 CLK WE

O6O5

WA7

DI1

WA8

MC31

DI2 CLK WE

O6O5

WA7

DI1

WA8

MC31

DI2 CLK WE

LUTRAMROM SRINIT0

SRINIT1

CED Q

CK

SR

SRINIT0SRINIT1

CED Q

CK

SR

SRINIT0SRINIT1

CED Q

CK

SR

SRINIT0SRINIT1

CED AQ

A

BQ

Q

CK

SR

FFLATCHAND2LOR2LSRINIT0SRINIT1

CED Q

CK

SR

FFLATCHAND2LOR2LSRINIT0SRINIT1

D5QMC31CYXORO5O6

MC31CYXORDXO5O6

C5QF7CYXORO5O6

F7CYXORCXO5O6

B5QF8CYXORO5O6

F8CYXORBXO5O6

A5QF7CYXORO5O6

F7CYXORAXO5O6

CED Q

CK

SR

FFLATCHAND2LOR2LSRINIT0SRINIT1

CED Q

CK

SR

FFLATCHAND2LOR2LSRINIT0SRINIT1

DPRAM64DPRAM32SPRAM64SPRAM32SRL16SRL32

LUTRAMROM

DPRAM64DPRAM32SPRAM64SPRAM32SRL16SRL32

LUTRAMROM

DPRAM64DPRAM32SPRAM64SPRAM32SRL16SRL32

LUTRAMROM

DPRAM64DPRAM32SPRAM64SPRAM32SRL16SRL32

DX

B

AMUX

BMUX

CMUX

C

D

DMUX

CQ

DQ

6入力

Page 16: Google 20130218

1024bit カウンタの作り方

16

(1)愚直に作ってみる

(2)2段に分けて作ってみる

Page 17: Google 20130218

1024bit カウンタの作り方

17

(1)愚直に作ってみる

(2)2段に分けて作ってみるfreq. 66.996MHz, 256スライス

freq. 503.170MHz, 32スライス

Page 18: Google 20130218

1024bit カウンタの作り方

18

(1)

(2)

Page 19: Google 20130218

カウンタのbit幅と周波数の関係

19

0

275

550

825

1100

4 32 256 1024 2048

Max Freq.(MHz)

Page 20: Google 20130218

浮動小数点数演算が苦手?

20

よくある全部入り浮動小数点数演算器を作ってみた32bit 単精度コア

最大動作周波数 約423MHz

838スライス(#.Regs.: 2592,#.LUTs:2122)

64bit 倍精度コア

最大動作周波数 約413MHz

2032スライス(#. Regs.: 8145, #.LUTs: 5502)

XC7K325Tなら59個入る?

XC7K325Tなら24個入る?

Page 21: Google 20130218

浮動小数点数演算が苦手?

21

コンポーネントだけなら32bit 単精度コア

加減算器 175スライス

乗算器 49スライス,3DSP

64bit 倍精度コア

加減算器 301スライス

乗算器 143スライス,11DSP

XC7K325Tなら291個入る?

XC7K325Tなら280個入る?

XC7K325Tなら169個入る?

XC7K325Tなら76個入る?

たぶん,こういう方向で何かあればいいんじゃないかなあ...

Page 22: Google 20130218

データの入出力ってどうやるの?パソコンとの通信

PCIe,イーサネット,UART

FPGA同士の通信

Rocket I/O,GPIO

その他ペリフェラルとの通信

LVDS,GPIO

22

Page 23: Google 20130218

データの入出力ってどうやるの?パソコンとの通信

PCIe,イーサネット,UART

FPGA同士の通信

Rocket I/O,GPIO

その他ペリフェラルとの通信

LVDS,GPIO

23

Page 24: Google 20130218

HDLに実装したUDP/IPの性能

24

e7 UDP/IP IP¸®�FPGA�ÉÂÆÝà´?c¬<s�,V!!

E(959.1Mbps�®ÐÙ¶à»×Þ}ÅàÁru¬,V�ÐÜƸÚ�W¬FPGA��/YÊàÇ°±®���,V�ª���á1000BASE-T�ruw3¬E(~PY�ª�����¢�ã�

e7 UDP/IP IP� ��������MAC��IP��UDP��FPGA��������������������

UDPÅàÁ{� ÆàÁÚ̶ÂÆ�G{(Octet)

1Gbps��©� E(̶ÂÆA�

,RruÅàÁÛàÆ (Mbps)

64 130 961538 486.4

256 322 388198 792.9

1024 1090 114678 940.6

1472 1538 81274 959.1

FPGA��Ðܿ¹áÀÎÆ°±®|\��i��!!

e7UDP/IP IP¸®�ܼ´�£�ÐÜƸÚ�W¬,V�¢���áÀÎÆ°±®¦ÀÎÆ°±®¬���ª�¤�Ðܿ¹�8i�©¢�­ã6��á��¥�ÊàÇ°±®kj<�á|\ÃàÚ�ÉÂÆÝà´�ÅàÁ¬>��ªN"�|\���¢�ã�

.9FPGAám�ÒàÇ�

e7 UDP/IP¸®�áSpartan 6áVirtex 5áVirtex 6���ª��¬_oQ��ã ¢�áSP605áML506áML605���¬Ll���¢�ã ¿ÂÆ®ÂÐ<��6��ÒàǬk+�ª���b�� �¬�_o����¢�ã ��¡��FPGAáFPGAm�ÒàÇ �.9¥�e��ã n����^p����ã

Xilinx ISE¬���|\���

スループット

Pentium4 2.8GHz512MBCentOS

PC(1)

Core i7-3930K 3.2GHz16GBWindows7 Pro.

PC(2)

レイテンシ(μ秒)

16Byte 256Byte 1024Byte

FPGA 61 77 120

PC(1) Java 228 200 222

PC(1) C 149 149 196

PC(2) Java 200 200 202

表 3 リソース使用量の比較結果レジスタ数 LUT 数 占有スライス数 BRAM36E1

Native 1620 2212 779 12

JavaRock 1472 2084 785 12

user-modulee7UDPIP-Core

MAC

TX

FPGA

PC

RX

BRAM

BRAM

GbE

図 7 イーサネットを介して PC と FPGA を接続するシステムの例

JavaRockで合成した場合のハードウェアリソース量が下回ったが,読み書きをカウンタするレジスタの使い方などの違いによるもので本質的な違いはないと考えられる.また合成の結果得られた最高動作周波数はどちらも 211.751MHzであった.

4. 3 ケース 2: イーサネットで接続する場合次に,協調設計の対象となる FPGAと CPUが UDP/IP通

信を介してデータを共有するシステムを設計することを考える.イーサネットインタフェイスは FPGAでも一般的になりつつあり,多くの評価ボードでもイーサネットポートが搭載されている.イーサネットを使うことで,接続する CPUや FPGAの個数や物理的な配置を比較的自由に取り扱うことができるため,柔軟な HW/SW協調システムの構築が可能となる.本稿ではケーススタディとして表 1 に示した諸元の PC と

ML605をイーサネットを介して図 7のように接続する例を考える.プロトコルには UDP/IP を用いる.本稿では,イーサネットおよび UDP/IPのプロトコル処理にイーツリーズ・ジャパン社の e7UDP/IP IPコア [13]を用いる.e7UDP/IP IPコアは,FPGA上のロジックのみでプロトコル処理を実現しているソフトマクロであり,ユーザモジュールからハンドシェイクプロトコルでアクセスして GbE上で UDPパケットの送受信ができる.この IPコアは,ペイロード 1472バイトの UDPパケットを 959.1Mbpsで送信できる性能を有する.本稿では,PC(CPU)と FPGAが UDP/IPで接続された協

調システムの設計をする場合のプリミティブ処理の性能評価として,UDPパケット受信し返送するエコーバックモジュールを,単純なステートマシンとして RTLで設計した場合 (Native)とJavaプログラムから JavaRockから合成した場合 (JavaRock)

とで比較する.図 8 に UDP パケットをエコーバックを行うJava プログラムを示す.図 6 に示した PCIe 経由でメモリを読み書きするケーススタディと違い,図 8のプログラムでは受信パケットデータを送信パケットキューにコピーしている.このメモリアクセスは,JavaRockがコンパイル時に e7UDP/IP

IPコアのメモリアクセスに透過的に変換される.まず,スループットを比較した結果を表 4に示す.これは,図

7に示したシステムで「PCが FPGA上のモジュールに UDP

パケットを送信して返送パケットを受信する処理」を 10万回繰り返すのにかかった時間から求めたスループットである.データのペイロードとして,16Byte,256Byte,1024Byteの 3パタンで評価を行った結果を示している.ここで,JavaRock(trad.)

に示した結果は,節 3. 2 で述べた拡張 JRHI を用いずにプロ

! "public class UDPEcho{

private final UDP_TX udp_tx = new UDP_TX();

private final UDP_RX udp_rx = new UDP_RX();

public void run(){

while(true){

while(udp_rx.valid == false) ;

udp_rx.read_flag = true;

for(int i = 0; i < udp_rx.data_length; i++){

int d;

d = udp_rx.data[i];

udp_tx.data[i] = d;

}

udp_tx.dest_ip = udp_rx.src_ip;

udp_tx.dest_port = udp_rx.src_port;

udp_tx.src_ip = udp_rx.dest_ip;

udp_tx.src_port = udp_rx.dest_port;

udp_tx.data_length = udp_rx.data_length;

udp_rx.read_flag = false;

while(udp_tx.busy == true) ;

udp_tx.start = true;

udp_tx.start = false;

}

}

}

# $図 8 UDP/IP をエコーバックする Java プログラム

表 4 スループットの評価結果 (MBps)

16Byte 256Byte 1024Byte

Native 0.262 3.31 8.47

JavaRock 0.262 3.20 8.32

JavaRock(trad.) 0.259 3.03 6.82

PCGbE

PC(1)

or

PC(2)

図 9 PC との対向で UDP/IP のエコーバックを行う評価システム

グラムを記述し合成した場合の処理性能である.すなわち,図8 に示した Java プログラムのメモリコピーの部分を,従来のJRHIを用いて明示的にメモリアクセスのための信号操作を記述した Javaプログラムを合成した場合のスループットである.この結果より,JavaRock で合成したモジュールのスループットは,Nativeに比べて遜色ないと言える.また,JavaRockとJavaRock(trad.)の結果を比較すると,1024Byte単位のパケット処理を行った場合に 1.2 倍高速化できていることがわかる.また,この差は単位処理内でメモリにアクセスする回数の増加に伴って大きくなることがわかる.これは,透過的にハードウェアアクセスとするよう拡張した JRHIが有効であることを示している.さらに,UDP/IP によるエコーバックのスループットを評

価するために,表 5 に示す,図 9 のような PC 上で動作するUDP/IPのエコーバックソフトウェアに対してパケットを連続で送る場合のスループットを評価した結果と比較する.エコーバックソフトウェアは Javaと Cで記述し,PC(1)では Java版と C版を,PC(2)で Java版を実行した.比較に用いた PC(1)

と PC(2)の諸元をそれぞれ表 6と表 7に示す. 表 4と表 5の結果を比較すると,FPGAとのスループットが PCのとスループットに比べ約 2,3倍高速に動作していることが分かる.すなわち,UDPで接続した FPGAに処理をオフロードすることで,CPUにオフロードする場合よりも高速に処理させること

— 5 —

Page 25: Google 20130218

メモリ使えるの?FPGA内蔵LUTRAM

演算回路との共用.速い

FPGA内蔵BlockRAM

FPGA内の専用リソース.速い.

外部メモリ

SRAM: 速い.でも高い.

DRAM: 遅い.でも安い.25

Page 26: Google 20130218

DDR3メモリにアクセスしてみた

26

49サイクル

76サイクル

UPLいろんな 制御信号線

e7MemIface DDR3

とりあえず初期実装としてはこんな感じ

100MHz 400MHz

Page 27: Google 20130218

Universal Protocol Line

27

ちょっと寄道

������

[a,b,c,d] ����

[w,x,y,z]

��� �K%��� �K &� �KAJ@H8EJ@K C89GBG=?;��K7�4�

��1��0�7 3/5-+�6�

��2�7 3/5-��,6�

a b c L�

w x y z

���

��� �*���

' � = "�(.)6�

��

a

b

c

d

w

x

y

z

���K���K����!2 >8DI:*�#K�� � �*�$�

��2 ������

w=a+b,x=b-c, y=w/x,z=d+1

<IBF0 ���*��

UPL��������������������������#$" !���� ��

Page 28: Google 20130218

Universal Protocol Line

28

ちょっと寄道! /VQSUFJ@B�),G���+P&4�)G$" ! /�)G� P]AG#���F-� ! /#���^0 ;N?��VQSU7\� �F�OM1�

�)����� ����� �)�

�*'%�

VQSUD<B� ;NM� VQSUD<B ;NM�

0���7�K6G� FJLTYRP �9�NE3D8\*��F>G:DP �5\��G� P��;=M1 D3@?WXY����72@BIJ3�

��!Z.�![��D (�!Z�,![��P '%C�L�HM�

! &���*1�/I�!,��.J ! &B<>�K=H;"�K=H;����K=H;��*)�

! & ��*1�/I��,��.J ! &A8<>C6HD<>�

�L&���25MHzK32bit�

&&&%:>FH#���+02=H;,��

&&&%=H;-@4?E5G9H=3G7�

= A8<>,�(,�,$��'K� �'�

a b

c

MSB LSB

! &���*1�/I�!,��.J ! &B<>�K=H;"�K=H;����K=H;��*)�

! & ��*1�/I��,��.J ! &A8<>C6HD<>�

�L&���25MHzK32bit�

&&&%:>FH#���+02=H;,��

&&&%=H;-@4?E5G9H=3G7�

= A8<>,�(,�,$��'K� �'�

a b

c

MSB LSB

Page 29: Google 20130218

高位合成言語

29

手軽なハードウェア開発を夢見て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 30: Google 20130218

高位合成言語

30

タイプ別に高位合成言語を分けてみた

既存の高水準言語ベースのHDL:

   ImpulseC, MaxCompiler など

既存の高水準言語をハードウェアに:

   AutoESL, CyberWorkBench, Lime, JavaRock

モダンな概念を取り入れた新しいHDL:

   Bluespec

Page 31: Google 20130218

.java%

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

.vhdl%

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

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

JVM%

JavaRock

31

JavaRockの目指すところJavaプログラムをそのままHW化する

追加構文,データ型は導入しない

記述に制限は加える

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

“Javaで書けることを全部HDLにする”ではないVol. 48 No. 5 FPGA 向け高位合成言語としての Java の活用手法の検討 9

RandomPlayer MCPlayer

Game FPGAMain

MonitorWrapper RS232CWapper

Player

Executable as Software

JVM FPGA

ICFPTPlayer

Calculator

calc

Implement-able onto FPGA

monitor rs232c

playerplayer

2

HDL modules HDL modules

図 15 connect6 のデバッグで用いたクラスのクラス図

VGAJavaTestSwingFrame VGAIf

VGAWrapper

Executable as Software

JVM FPGA

Implement-able onto FPGA

monitor

vgavga

HDL modules

SwingCanvas

図 16 グラフィクス描画ハードウェア設計のためのクラス構造

と ICFTPPlayer.javaとして Javaで実装する.図 15 に,Java で実装した connect6 をデバッグする際に利用したクラス群のクラス図を示す.ICFPTPlayer と Calculator からなる ICFPT で提示された connect6プレイヤは,他の幾つかのプレーヤ実装と共に Playerインターフェイスを実装するクラスである.このクラスのインスタンスは,Game とFPGAGameで共有される.Gameは JVM上で動作させるときのメインルーチンであり,FPGAGameは FPGA

上に実装するときのトップエンティティに相当するクラスである.Gameを含むクラス群は JVMで直接実行することができ,FPGAGameを含むクラス群は FPGA

に実装可能である. このように,ソフトウェアとしてのデバッグ環境を構築することで,簡単かつ効率的にデバッグできる.

5.3.2 VGAグラフィクス描画ハードウェアVGAグラフィクス描画ハードウェアを設計することを考える.描画ルーチン,たとえば四角形を色を変えながら描画するルーチンをハードウェア化するとする.図 16にデバッグのために設計したクラス階層を示す.ハードウェア化すべき,描画ルーチンを記述した

VGAJavaTestから,実際の描画対象として Swingで

図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデバッグ

図 18 VGA グラフィクス描画ハードウェア

作成した描画対象である SwingFrameをインスタンシエーションすることで図 17に示すようにソフトウェアとして実行結果を確認できる. 一方でハードウェアモジュールを JRHI でラップした VGAIf をインスタンシエーションすることで,図 18に示すように実ハードウェアとして実行結果を確認できる.今回は説明のために,ハードウェア生成時とソフトウェアスタック上のクラスで異なるクラス名を用いた.しかし,同じクラス名でソフトウェアあるいはハードウェアのモジュールを設計しておき,コンパイル時および実行時のクラスパスでそれぞれを呼び出すようにすることで,ソースコードはまったく変更することなく,どちらの環境も利用できるようにすることもできる.

6. ま と めJavaRockは,複雑なアプリケーションを FPGAで処理するための開発をサポートする高位合成言語の設

Vol. 48 No. 5 FPGA 向け高位合成言語としての Java の活用手法の検討 9

RandomPlayer MCPlayer

Game FPGAMain

MonitorWrapper RS232CWapper

Player

Executable as Software

JVM FPGA

ICFPTPlayer

Calculator

calc

Implement-able onto FPGA

monitor rs232c

playerplayer

2

HDL modules HDL modules

図 15 connect6 のデバッグで用いたクラスのクラス図

VGAJavaTestSwingFrame VGAIf

VGAWrapper

Executable as Software

JVM FPGA

Implement-able onto FPGA

monitor

vgavga

HDL modules

SwingCanvas

図 16 グラフィクス描画ハードウェア設計のためのクラス構造

と ICFTPPlayer.javaとして Javaで実装する.図 15 に,Java で実装した connect6 をデバッグする際に利用したクラス群のクラス図を示す.ICFPTPlayer と Calculator からなる ICFPT で提示された connect6プレイヤは,他の幾つかのプレーヤ実装と共に Playerインターフェイスを実装するクラスである.このクラスのインスタンスは,Game とFPGAGameで共有される.Gameは JVM上で動作させるときのメインルーチンであり,FPGAGameは FPGA

上に実装するときのトップエンティティに相当するクラスである.Gameを含むクラス群は JVMで直接実行することができ,FPGAGameを含むクラス群は FPGA

に実装可能である. このように,ソフトウェアとしてのデバッグ環境を構築することで,簡単かつ効率的にデバッグできる.

5.3.2 VGAグラフィクス描画ハードウェアVGAグラフィクス描画ハードウェアを設計することを考える.描画ルーチン,たとえば四角形を色を変えながら描画するルーチンをハードウェア化するとする.図 16にデバッグのために設計したクラス階層を示す.ハードウェア化すべき,描画ルーチンを記述した

VGAJavaTestから,実際の描画対象として Swingで

図 17 VGA グラフィクス描画ハードウェアをソフトウェアでデバッグ

図 18 VGA グラフィクス描画ハードウェア

作成した描画対象である SwingFrameをインスタンシエーションすることで図 17に示すようにソフトウェアとして実行結果を確認できる. 一方でハードウェアモジュールを JRHI でラップした VGAIf をインスタンシエーションすることで,図 18に示すように実ハードウェアとして実行結果を確認できる.今回は説明のために,ハードウェア生成時とソフトウェアスタック上のクラスで異なるクラス名を用いた.しかし,同じクラス名でソフトウェアあるいはハードウェアのモジュールを設計しておき,コンパイル時および実行時のクラスパスでそれぞれを呼び出すようにすることで,ソースコードはまったく変更することなく,どちらの環境も利用できるようにすることもできる.

6. ま と めJavaRockは,複雑なアプリケーションを FPGAで処理するための開発をサポートする高位合成言語の設

http://javarock.sourceforge.net/

Page 32: Google 20130218

高位合成言語

32

HDL覚えなくてもHW設計ができる...というのは言い過ぎかもですが

JavaRock

ImpluseC

http://www.cs.tsukuba.ac.jp/~yoshiki/FPGA/Contest/index.php?FPGA2011%C1%B4%C2%D0%C0%EF%CD%FA%CE%F2

Page 33: Google 20130218

高位合成言語

33

HDL覚えなくてもHW設計ができる...というのは言い過ぎかもですが

http://d.hatena.ne.jp/nushio/20120708

Page 34: Google 20130218

で,実際FPGAってどんな素子なの?「それ1クロックで...」の光と影

浮動小数点数演算が苦手?

データの入出力ってどうやるの?

メモリ使えるの?

高位合成言語について

34

要・工夫

やり方による

豊富使える.大容量にはコスト有

お試しください