2015年8月28日 14:30-15:50 (s5c)
SWEST17@下呂温泉水明館(第38回SIGEMB招待講演)

Pythonによる高位設計
フレームワークPyCoRAMで
FPGAシステムを開発してみよう
高前田 伸也
奈良先端科学技術大学院大学 情報科学研究科
E-mail: shinya_at_is_naist_jp

今日のテーマn 「好きな道具」で「好きなもの」を作る世界l 発表者の場合• 好きな道具: 好きな言語（Python）・モデル・書き方• 好きなもの: FPGAを使ったカスタムコンピュータn 「こんな風に設計できたらいいな」を実現しようl 自分の手になじむ道具を実際に作ろう、そして公開しようl 発表者の場合• PyCoRAM: PythonによるIPコア高位設計フレームワーク• Pyverilog: Verilog HDL解析・生成ツールキット• Veriloggen: PythonでVerilog HDLを組み立てる軽量ライブラリ

SWEST2015

Shinya T-Y, NAIST

2

All software are available!
n GitHubで公開中
l PyCoRAM: https://github.com/PyHDI/PyCoRAMl Pyverilog: https://github.com/PyHDI/Pyverilogl Veriloggen: https://github.com/PyHDI/veriloggen$ git clone https://github.com/PyHDI/Pyverilog.git�
$ git clone https://github.com/PyHDI/PyCoRAM.git�
$ git clone https://github.com/PyHDI/veriloggen.git�
n PIP（Pythonパッケージ管理）でもインストール可l ただしGitHubが最新版です$ pip install pyverilog�
$ pip install pycoram�$ pip install veriloggen�SWEST2015

Shinya T-Y, NAIST

3

目次n FPGAとは？
l FPGAの基礎l 近年のFPGAを取り巻く環境n 高位合成ツールとは？
l 高位合成の基礎
l 商用ツールとオープンソースなツールn Pythonによる高位設計フレームワークPyCoRAMl PythonとVerilog HDLを組み合わせたIPコア設計ツールl 関連ツールの紹介: Pyverilog, Veriloggenn 今後の高位合成ツールはどうあるべきか？
l まじめな話とフランクは話n まとめSWEST2015

Shinya T-Y, NAIST

4FPGAとは？

SWEST2015

Shinya T-Y, NAIST

5

ヘテロジニアスコンピューティング
Multicore (Intel Corei7)

GPU (NVIDIA GeForce)

OoO
Core

OoO
Core

OoO
Core

OoO
Core

L2

L2

L2

L2

L3 CacheL2 Cache

DDR3 DRAMGDDR5 DRAM

Manycore (Intel Xeon Phi)FPGA (Xilinx Virtex-7)

DDR3 DRAM

SWEST2015

DDR3 DRAM

Shinya T-Y, NAIST

6FPGA (Field Programmable Gate Array)n 中身を改変可能なLSI(PLD: Programmable Logic Device)l 設計者が独自のデジタル回路を形成することができる
l 対してCPUやGPUはFLD (Fixed Logic Device)？

n CPUなどとの大きな違いは？
l CPUの振る舞いはソフトウェア（プログラム）で規定される• ユーザはCPUそのものの回路を変更することはできないl FPGAの振る舞いはハードウェアそのものの変更で変えられる

Digital circuits
SWEST2015

Shinya T-Y, NAIST

7FPGAボードの基礎
Digilent NetFPGA SUME
Price $24,500
SATA-3 x2

DDR3 SODIMM(4GB x2)

10Gbps Ethernet x4
SWEST2015

FPGA(Xilinx Virtex-7 XC7V690T)

PCI-express
Shinya T-Y, NAIST

8

Digilent Nexys3
FPGA: Xilinx Spartan-6 LX16
Size: Pipelined CPU ×2
Price: 15,000yen (Academic)

SWEST2015

Digilent ZedBoard
FPGA: Xilinx Zynq 7020
Size: Pipelined CPU ×8 (+ ARM DualCore)
Price: 60,000yen (Academic)

Shinya T-Y, NAIST

9

SSD

FPGA (Xilinx Zynq 7020, ARM Dualcore)+DDR3 DRAM 512MB

SSD Interface
Dual Camera
SWEST2015

Shinya T-Y, NAIST

10

Xilinx ZC706
FPGA: Xilinx Zynq 7045
Size: Pipelined CPU ×16
Price: 300,000yen

SWEST2015

Shinya T-Y, NAIST

11

Tokyo Electron Deice TB-6V-LX760-LSI
FPGA: Xilinx Virtex-6 LX760
Size: Pipelined CPU x100?
Price: 4,000,000yen?

SWEST2015

Shinya T-Y, NAIST

12ScalableCore System
FPGA: Xilinx Spartan-6 ×100
Size: Pipelined CPU x200?
Price: 100万円程度？

SWEST2015

Shinya T-Y, NAIST

13

アイランドスタイルFPGAの構成

IOB

CB

CB

LB

CB

SB

SB

CB

SB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

SB

CB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

CB

CB

SB

LB
CB

CB

SB

CB

LB

SB

CB

CB

SB

SB

SB
CB

Switch Block
Connection Block
I/O Block
Wire

SWEST2015

IOB

IOB

CB

CB

SB

Logic Block

IOB

CB

LB

IOB

IOB

CB

FPGA
• An LB has logicalcircuit components forboth combinational
circuits and sequential
circuits• They are connected via
IOB
interconnection
components (SB, CB
and wire)

IOB
Shinya T-Y, NAIST

IOB

IOB

IOB

IOB

IOB

14

アイランドスタイルFPGAの構成

IOB

CB

CB

LB

CB

SB

SB

CB

SB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

SB

CB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

CB

CB

SB

LB
CB

CB

SB

CB

LB

SB

CB

CB

SB

SB

SB
CB

Switch Block
Connection Block
I/O Block
Wire

SWEST2015

IOB

IOB

CB

CB

SB

Logic Block

IOB

CB

LB

IOB

IOB

CB

FPGA
• An LB has logicalcircuit components forboth combinational
circuits and sequential
circuits• They are connected via
IOB
interconnection
components (SB, CB
and wire)

IOB
Shinya T-Y, NAIST

IOB

IOB

IOB

IOB

IOB

15

Logic Blockn Two basic elements in a logic blockl LUT (Look Up Table): for combinational circuitsl Flip-flop: for memory (sequential circuits)
FPGA
IOB

CB

CB
LB

CB

SB

CB

SB

CB

SB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

SB

CB

LB

CB

LB

CB

LB

CB

SB

SB

SB

CB

CB

CB

CB

SB

LB

CB

CB

CB

SB

CB

IOB

LB

SB

CB

IOB

SB

SB

SB
CB

IOB

SWEST2015

IOB

CB

IOB

IOB

IOB

Logic Block

IOB

LUT
IOB

D Q

IOB

IOB

Shinya T-Y, NAIST

16

LUT: Look Up Tablen LUTs realize combinational logicsn An LUT returns a 1-bit value corresponding to the input
bit-vector (=Boolean function)l N-input LUT has 2N combinations of results: 4-input LUT has 16

a[0]
a[1]
a[2]

a[N-1]SWEST2015

N-input
LUT
Input

Output

000…0

0

000…1

1

…

…

111…1

0

Shinya T-Y, NAISTb

17

FPGA in Anywheren LSI設計・検証のプラットフォームとしてl LSIの機能を製造前に検証l HWの完成を待たなくてもSWの開発検証ができるl ソフトウェアシミュレータによる回路シミュレーションよりも高速に検証できるn 最終製品に組み込むLSIとしてl 画像処理l ネットワーク機器n アクセラレータとしてl データベース

Convolution

Pooling

Max Out

Convolution

Full Connectionl ウェブ検索l 証券取引l 機械学習
SWEST2015

Input Layer

Hidden Layers

Shinya T-Y, NAIST

Output Layer

18

ASIC vs. FPGAn ASIC (Application Specific Integrated Circuit)l それぞれのアプリケーションに特化した専用回路を設計• 専用パイプライン・高い周波数で高い性能

n FPGA (Field Programmable Gate Array)l どのアプリケーションも数種類のFPGAで実現：少量生産もOK
l 製品リリース後の回路構成の改変が可能
FPGA is cheaper

ASIC is cheaper
FPGA
ASIC

Cost

The number of units
SWEST2015

Shinya T-Y, NAIST

19増え続けるFPGAの回路規模n トランジスタのスケーリングによりFPGの回路規模も増大l 5年で6倍以上に増加
l 今後も更なる増加が予想• マルチダイ化• ３次元積層n その分設計が大変に
l 設計検証の時間が増大l 効率的な開発方式が必要• RTLのみの開発の限界• 高位合成処理系の利用
SWEST2015

Shinya T-Y, NAIST

From Xilinx UG872

20

How to Develop a Software?
Writing a softwarein programming languages

Compiler Flow

Preprocess

Compileint main(){�
int a = 1 + 2;�
printf(“Hello %d\n”, a);�return 0;�
}�

add $t0, $t1, $t2�li $v0, 1�
syscall�

Assemble

Link

Executable Binary
ELF01ABF00F1...�

Execution on a CPU
SWEST2015

Shinya T-Y, NAIST

21

How to Develop a (FPGA) Hardware?
Writing a hardware design in HDL(Hardware Description Language)

EDA Flow

Synthesis

Technology Mapping

Place and Route

Bitstream Generation

Original HW on an FPGA

Configuration of the bitstream
to an FPGASWEST2015

module top�
(input CLK, RST, �
output reg [7:0] LED);�
always @(posedge CLK) begin�
LED <= LED + 1;�
end�
endmodule�

Shinya T-Y, NAIST

1A0C021E...�
Bitstream22

近年のFPGAを取り巻く環境

SWEST2015

Shinya T-Y, NAIST23

ARM搭載FPGAの登場 (1)n ARMプロセッサ+FPGA (Xilinx Zynq, Altera SoC)l 専用インターコネクトで密結合，キャッシュ・DRAM共有l 普通のLinuxが動作する→大量なソフトウェア資源が利用可能

AlteraのARMベースSoC
https://www.altera.com/ja_JP/pdfs/literature/br/br-soc-fpga_j.pdf
Zynq-7000 All Programmable SoC
http://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html
SWEST2015

Shinya T-Y, NAIST24

ARM搭載FPGAの登場 (2)n 普通のFPGAとは何が違う？
l そもそも通常のFPGA上もCPU搭載可能（ソフトマクロ）l コア性能が数倍〜10倍違う• MicroBlaze: 100MHz〜200MHz, In-order, Single issue• ARM: 600MHz〜1GHz, OoO, Super scalarn 独自のHW/SW協調SoCの実現が容易になる
l 面倒な処理は処理はCPU上のソフトウェアで実現• ネットワーク・ファイルシステムなど

l 並列処理部はFPGA上の専用ハードウェアで実現• 並列度とメモリ帯域に応じて演算器を追加し高速化• 必要に応じて演算精度を削り更に高速化

l CPU-FPGAロジック間のデータ共有は？
• キャッシュ・DRAMをCPUとロジックで共有しているので簡単
SWEST2015

Shinya T-Y, NAIST25

例）Zynq 7000 アーキテクチャn ARM Cortex-A9 (Dual-core, OoO, 8-stage)n ３種類のCPU-PL間接続 (すべてAXIインターフェース)
GP• 低速• 制御レジスタ
アクセス用
HP• 高バンド幅• DRAMへのバースト転送向け
ACP• 低レイテンシ• キャッシュコヒーレント• CPUとのデータ共有向け

Cache

DRAM

AXI GP Port

http://www.ioe.nchu.edu.tw/Pic/CourseItem/4468_20_Zynq_Architecture.pdf
http://japan.xilinx.com/support/documentation/data_sheets/j_ds190-Zynq-7000-Overview.pdf
Shinya T-Y, NAISTSWEST2015

AXI HP Port

AXI
ACP
Port

26

浮動小数点ユニット搭載FPGAn 従来FPGAのDSP（乗算）ユニットは整数のみ対応
l 浮動小数点演算は変換ロジックを組み合わせて実現（ソフトマクロ）→大きな回路・電力オーバーヘッド• そのため浮動小数点演算ではGPUが有利だった

n Altera次期モデルがハードマクロ浮動小数点DSPを搭載
l コンピューティングデバイスとしてのFPGAの利用が増加？

SWEST2015

Altera Expands Floating-Point Hardware Support AcrossIts Product Lines
http://www.bdti.com/InsideDSP/2014/07/22/Altera
Shinya T-Y, NAIST
27

IPコアベースのシステム開発環境の普及n IPコアを開発・追加して繋げばHW完成J
l 標準的なインターコネクトでIPコア達を接続
l EDAツールが自動的にインターコネクトと（いくつかの）デバイス依存のインターフェースを生成してくれるため楽l いかにしてIPコアを簡単に開発するかが重要• 高位合成ツールの活用
FPGA
CPU

HW
Acc

HW
Acc

Interconnect
Ether

Xilinx VivadoにおけるIPコアとARMの接続
SWEST2015

Shinya T-Y, NAIST

DRAM
I/F

PCI-E

DRAM
28

アプリケーションの変化n 以前は画像処理やネットワーキングなどが主流
n 「ビッグデータ」指向へ: 脱ノイマン型？
l イーサネットNICでMemcached [Fukuda+, FPL’14]l Microsoft Bing search engine (Catapult) [Putnam+, ISCA'14]• FPGA間を専用線で接続するクラスタシステム

SWEST2015 Fig2 from [Fukuda+, FPL'14] Shinya T-Y, NAIST

Fig1 from [Putman+, ISCA'14] 29

高位合成のあれこれ

SWEST2015

Shinya T-Y, NAIST

30

高位合成とは？
n 動作モデルからRTLモデルを生成するツール・コンパイラl 入力: ソフトウェアのソースコード

フロント
エンド

ソースコード• C, C++, OpenCL, Java, Python, ...

l 出力: RTL（HDLソースコード）

構文解析
コントロール・
データフロー解析
スケジューリングn 構成：SWコンパイラと同等のフロントエンドと高位合成
ならではのバックエンドl フロントエンド: 抽象構文木(AST)生成・
コントロールデータフロー(CDFG)解析l バックエンド: 「いつ」「どの演算」をするか決めたり、演算を演算器に、変数をレジスタに割り当てり
SWEST2015

Shinya T-Y, NAIST

バックエンド• Verilog HDL, VHDL
アロケーション

制御回路生成

コード生成
RTL
31

FPGAシステムの設計フロー（高位合成なし）
要件・仕様

早い段階でHW/SWを分割
全体を一旦SW実装してから
HW/SW再設計することもシステム設計 (HW/SW分割)
データフロー・
メモリシステム

HWアーキテクチャ設計

ソフトウェア設計

クロックレベルの振る舞い・
HDLによる実装

RTL設計・実装

ソフトウェア実装

ほぼ合成ツール
による自動処理

論理合成・配置配線

コンパイル

HW
HW/SW結合によりシステム完成SWEST2015

SW

シミュレータを用いた検証を行
うこともシステム
Shinya T-Y, NAIST32

FPGAシステムの設計フロー（高位合成あり）
要件・仕様
システム設計全体をSWで実装
その後一部をHW化

ソフトウェア設計 (HW/SW混合設計)
ソフトウェア実装 (全体実装)

プログラミング
言語による動作
モデル実装

HW部高位設計

高位合成ツールによるRTL生成

高位合成

合成ツールによる自動処理

ソフトウェア実装

コンパイル

論理合成・配置配線
HW
HW/SW結合によりシステム完成SWEST2015

一部HW化の
ためのイン
ターフェー
スの実装等

SW

シミュレータを用いた検証を行
うこともシステム
Shinya T-Y, NAIST33

RTL設計と高位設計の違い
n RTL (Register Transfer Level) 設計l クロックサイクルレベルでレジスタ間のデータ移動や演算のタイミングを定義する
l Timed設計：「なに」を「いつ」「どのように」行うかを定義
l 通常のソフトウェアでいう「アセンブリ」の様なもの

n 高位設計（動作設計・High Level Synthesis）
l （一般に）汎用プログラミング言語を用いて振る舞いを定義l Untimed設計：「なに」を行うかを実装• 「いつ」「どのように」かは定義しなくても良い• 指示子(Directive)で「いつ」「どのように」の情報を付加することにより、より良いハードウェアが生成されるl 通常のソフトウェアでいう高級プログラミング言語に設計
SWEST2015

Shinya T-Y, NAIST

34

例：2配列の積和演算 (c += a * b)
RTL設計 (Verilog HDL): 105行，2098文字，15分
積和演算器（トップレベル）

乗算器「いつ」「なに」を「どのように」するかを設計者が決める
SWEST2015

Shinya T-Y, NAIST

35

例：2配列の積和演算 (c += a * b)
高位設計 (C言語): 11行，163文字，1分「なに」をするかだけを→1/10の記述量と1/15の開発時間
設計者が決める（ただしディレクティブ等はなし）（性能が出れば）高位設計最高！
SWEST2015

Shinya T-Y, NAIST36

FPGA向け商用高位合成ツールが多数登場
n Xilinx Vivado HLS (+ SDSoC)l C/C++で振る舞いを定義・ディレクティブで性能チューニング
l SDSoCならSWコードから部分的にHW化・I/Fも自動生成l その他C言語ベースImpulse C・CWB・eXCiteなど

n OpenCL系: Altera OpenCLやXilinx SDAccell ホストPCありき・ホストPC上SWのお作法も定義

https://www.youtube.com/
watch?v=URUVkq6zQhQ

SWEST2015

Shinya T-Y, NAIST

37

オープンソースな高位合成ツールの登場
n LegUp: トロント大で開発されているCベース処理系l C記述をMIPS CPU用SW部とHW部に自動分割・論文多数

n Synthesijer: Javaによる高位合成処理系
l Java言語仕様に改変なし，サブセットをそのまま合成可能
クイックスタート 5/8

Synthesijer とは✔

✔

(5) 間隔をおいて変数ledをtrue/falseするプログラムを書く

JavaプログラムをFPGA上のハードウェアに変換✔

複雑なアルゴリズムのハードウェア実装を楽に✔

オブクジェクト指向設計による再利用性の向上

Open-source

特殊な記法，追加構文はない✔

ソフトウェアとして実行可能．動作の確認、検証が容易✔

書けるプログラムに制限は加える(動的なnew，再帰は不可など)
while(){
if(...){…
}else{…
…
}….
}

複雑な状態遷移も，Javaの制御構文を使って楽に設計できる

Lチカに相当する変数

Javaコンパイラ
フロントエンド

Synthesijer
エンジン

Javaコンパイラ
バックエンド

適当なウェイト

点滅

合成
配置配線

自動コンパイルが裏で動くので，Javaコードとしての正しさは即座にチェックされる

同じJavaプログラムをソフトウェアとしてもFPGA上のハードウェアとしても実行可能
29

http://www.sigemb.jp/ESS/2014/files/IPSJ-ESS2014003-1.pdf
SWEST2015

Shinya T-Y, NAIST

38

高位合成のメリット・デメリットn メリットJl いつものプログラミング言語でハードウェアが開発できるl 少ない記述量：RTL設計の1/10以下l デバッグのしやすさ：
通常のソフトウェアとして実行して機能レベルの正しさを検証n デメリットLl 達成可能な性能・電力効率・面積効率はRTL設計の方が高い• RTL設計は開発者の知見（アプリケーションの要件等）が直接反映l 癖のあるソースコードを書く必要がある• 専用の型の導入や機能制限• 性能を追求するにはディレクティブを多数挿入する必要がある– 結局書き直すならRTLで書き直しても良いのでは？という人も多いl クロックサイクルレベルの振る舞いを書くのが苦手• I/Oの制御を細粒度に行う回路等は不向き（なことが多い）
SWEST2015

Shinya T-Y, NAIST

39

PyCoRAM
Pythonによるハードウェア
IPコア設計フレームワーク

SWEST2015

Shinya T-Y, NAIST40

背景n CPU with IP-coresl ハードマクロCPU (ARM) 搭載FPGAが主流に: Xilinx Zynq, etcl 専用HWはIPコアとして実装しインターコネクト（AXI4やAvalon）を介してCPUと接続n どのようにしてアクセラレータIPコアを設計するか？
l HDLですべて設計するのは大変• 例）演算とメモリアクセスのスケジューリング
– ダブルバッファリングとか面倒– HDLでステートマシンを書くのは大変だし間違えやすいl 性能を出すには高稼働率パイプラインとデータ供給機構が必要• ストールのない綺麗なパイプラインを定義したい: HDLが得意• （OSSな）高位合成系だとチューニングが難しいn →データ転送を抽象化すれば幸せそう？
SWEST2015

Shinya T-Y, NAIST

41

CoRAM [Chung+,FPGA’11]n FPGAアクセラレータのためのメモリ抽象化l 高位モデルによるメモリ管理でアクセラレータをポータブルに• 計算カーネルとメモリアクセスの分離• ソフトウェアのモデルによるメモリアクセスパターンの記述
Read/Write

Communication
FIFOs (Registers)

CoRAM
ChannelRead/Write

Read
Write

CoRAM
MemoryAbstracted
On-chip Memories

HW Kernels(Computing Logics)

SWEST2015

Off-chipMemoryShinya T-Y, NAISTManageControl Threads(Memory Access
Pattern)42

PyCoRAM [Takamaeda+,CARL’13]n 抽象化されたインターコネクトとメモリシステムの上でIPコアを開発するフレームワークl 標準的なインターコネクトに繋げる：AMBA AXI4, Altera Avalonl ポータブル：抽象化がプラットフォームの違いを吸収l CPUや他のIPコアと共存が容易：ビルディングブロック開発
Portable application
with PyCoRAM

Cooperation with standard IP-cores

Accelerator logic
Standard IP-core

CPU

PyCoRAM
Abstraction
On-chip Interconnect (AXI4, Avalon)

SWEST2015

Device-dependent Interfaces(DRAM, etc)
Shinya T-Y, NAIST

43

PyCoRAM：フレームワーク構成n 入力：2種類のソースコードl データフロー（演算パイプライン）：Verilog HDLl データ転送制御：Pythonn 出力：演算パイプと制御機構を持つIPコアl DMAを主体としたデータ転送重点型ハードウェアが合成される
入力: 高抽象度
デザイン

PyCoRAMコンパイルフロー

出力: 演算パイプライン+データ供給エンジンを持つアクセラレータIPコア・システム
IPコア

制御フロー
(Python)
SWEST2015

制解
対象
解析

高位
合成
処理系
による
RTL化

制御

データパス

インター
フェース
合成
・
IPコア
パッケー
ジ化

IO Channel/
IO Register

RTL
変換

Channel/Register

データフロー(Verilog HDL)

HW
構造
解析

Memory/Stream

DMAコントローラ

オンチップ・インターコネクト
メインメモリ (DRAM)

Shinya T-Y, NAIST

44

PyCoRAM：アーキテクチャ

制御
Channel/Register

IO Channel/
IO Register

データパス

Memory/Stream

SWEST2015

DMAコントローラ

Shinya T-Y, NAIST

45

PyCoRAM：アーキテクチャ
Control Thread
Modeled in Python

Computing Logic
Modeled in Verilog HDL

制御
Channel/Register

IO Channel/
IO Register

データパス

Memory/Stream

SWEST2015

DMAコントローラ

Shinya T-Y, NAIST

46

PyCoRAM：アーキテクチャ
Channel: ロジック-スレッド間FIFO
Register: ロジック-スレッド間共有レジスタ

制御
Channel/Register

IO Channel/
IO Register

データパス

Memory/Stream

DMAコントローラ

Memory: ロジック用ローカルメモリ
Stream: ロジック用FIFOSWEST2015

IO Channel: 外部制御用FIFOIO Register: 外部制御用共有レジスタ

Shinya T-Y, NAIST

47

PyCoRAM：アーキテクチャ

制御
Channel/Register

IO Channel/
IO Register

データパス

Memory/Stream

DMAコントローラ

オンチップ・インターコネクト
メインメモリ (DRAM)
SWEST2015

Shinya T-Y, NAIST

48

PyCoRAM：アーキテクチャ

制御
Channel/Register

IO Channel/
IO Register

データパス

Memory/Stream

DMAコントローラ

Master Interface
メモリへ能動的にアクセス

オンチップ・インターコネクト
Slave Interface
CPUからアクセスされる

メインメモリ (DRAM)
SWEST2015

Shinya T-Y, NAIST

49

PyCoRAMにおけるIPコアの作り方・でき方
n 2種類のファイルを用意する
l Verilog HDL: 計算ロジック（データパス）l Python: コントロールスレッド（制御）CoramMemory1P�
#(�.CORAM_THREAD_NAME("thread_name"),�
.CORAM_ID(0),�
.CORAM_ADDR_LEN(ADDR_LEN),�
.CORAM_DATA_WIDTH(DATA_WIDTH)�
)�
inst_memory�(.CLK(CLK),�.ADDR(mem_addr),�
.D(mem_d),�
.WE(mem_we),�
.Q(mem_q)�
);�

def calc_sum(times):�
ram = CoramMemory(idx=0, datawidth=32, size=1024)�
channel = CoramChannel(idx=0, datawidth=32)�
addr = 0�
sum = 0�for i in range(times):�
ram.write(0, addr, 128)�
channel.write(addr)�
sum += channel.read()�
addr += 128 * (32/8)�
print(‘sum=’, sum)�
calc_sum(8)�

n PyCoRAMが自動的にIPコアのパッケージを作成
l Python-Verilog高位合成とRTL変換を自動で行う
SWEST2015

Shinya T-Y, NAIST

50

計算ロジックにおけるPyCoRAMオブジェクトn ブロックRAMやFIFOと同様のインターフェスl ロジック側からおなじみのインターフェースでアクセスできるl いくつかのパラメータで特性を指定• スレッド名，ID，データ幅，アドレス幅，スキャッターギャザー等

l 外部を接続するインターフェースは自動的に追加される

CoramMemory1P�
#(�.CORAM_THREAD_NAME("thread_name"),�
.CORAM_ID(0),�
.CORAM_ADDR_LEN(ADDR_LEN),�
.CORAM_DATA_WIDTH(DATA_WIDTH)�
)�
inst_memory�(.CLK(CLK),�.ADDR(mem_addr),�
.D(mem_d),�
.WE(mem_we),�
.Q(mem_q)�
);�

CoramChannel�
#(�.CORAM_THREAD_NAME("thread_name"),�
.CORAM_ID(0),�
.CORAM_ADDR_LEN(CHANNEL_ADDR_LEN),�
.CORAM_DATA_WIDTH(CHANNEL_DATA_WIDTH)�
)�
inst_channel�
(.CLK(CLK),�
.RST(RST),�
.D(comm_d),�
.ENQ(comm_enq),�
.FULL(comm_full),�
.Q(comm_q),�
.DEQ(comm_deq),�
.EMPTY(comm_empty)�
);�(a) Memory(b) Channel

SWEST2015

Shinya T-Y, NAIST

51

Pythonによるコントロールスレッドn PyCoRAMオブジェクトに対する処理を記述する
l CoramMemory: read(), write()• MemoryとDRAMとの間のDMA転送によるデータ移動l CoramChannel: read(), write()• 計算ロジックとコントロールスレッドの間のデータのやりとり
0� def calc_sum(times):�
ram = CoramMemory(idx=0, datawidth=32, size=1024)�
1�
channel = CoramChannel(idx=0, datawidth=32)�
2�
addr = 0�
3�
sum = 0�4�for i in range(times):�
5�
ram.write(0, addr, 128)� # Transfer (off-chip DRAM to BRAM)
6�
channel.write(addr)�
# Notification to User-logic
7�
sum += channel.read()� # Wait for Notification from User-logic
8�
addr += 128 * (32/8)�
9�
print(‘sum=’, sum)�
# $display Verilog system task10��11� calc_sum(8)�
SWEST2015

Shinya T-Y, NAIST

52

例: 配列の和を求めるアクセラレータn 1メモリ+1スレッドの簡単なハードウェアl CoramMemoryにDRAMからデータを読み込むl スレッド側でCoramMemory-DRAM間のデータ転送系列を表現
Computing Logic (Verilog HDL)
Coram
Memory 0
A+
Control Logic

SWEST2015

ControlThread(Python)

sum

Coram
Channel 0

Shinya T-Y, NAIST

53

計算ロジック (1): I/Oポート

クロック(CLK)とリセット(RST)
以外に専用のI/Oは不要
CoramMemoryのための信号(BRAMと同じインターフェース)
CoramChannelのための信号(FIFOと同じインターフェース)
ステートマシン用変数
SWEST2015

Shinya T-Y, NAIST

54

計算ロジック (2): パイプライン/FSM

CoramChannelから読み出し（コントロールスレッドから受信）
SWEST2015

CoramChannelに書き込み（コントロールスレッドに通知）

Shinya T-Y, NAIST

55

計算ロジック (3): 子インスタンス
CoramMemory(BRAMと同じインターフェース)

CoramChannel(FIFOと同じインターフェース)

SWEST2015

Shinya T-Y, NAIST

56

コントロールスレッド (Python)ram (CoramMemory)とchannel (CoramChannel)の宣言

CoramMemoryにDMA転送したり
CoramChannelから読んだり書いたり

SWEST2015

Shinya T-Y, NAIST

57

コンパイルSWEST2015

Shinya T-Y, NAIST

58

シミュレーション結果

SWEST2015

Shinya T-Y, NAIST

59

シミュレーション結果（波形）SWEST2015

Shinya T-Y, NAIST60例）行列積IPコアn 行列A・B・Cの各行をCoRAMメモリに格納l DRAMとの間のデータ転送をコントロールスレッドが担当
l 毎サイクル乗算パイプラインにデータを投入l 行列Bの転送と演算をダブルバッファリングl SIMD幅をメモリバンド幅を使い切るように合わせる
ControlThread(Python)Computing Logic (Verilog HDL)CoRAMMemory 0
A

B

CoRAM
Memory 1

SWEST20158-stage
Multiply
Pipeline

×

+

check
sum

CoRAM
Memory 2+
Control Logic

C

sum

CoRAM
Channel 0

Shinya T-Y, NAIST

I/O
Channel61例）ダイクストラIPコアn PyCoRAMを使って演算モジュールはVerilog HDLで実装
メモリアクセス制御はPythonで実装

Generated by
PyCoRAM

User Definition (Modeled in Verilog HDL and Python)Control Threads (Modeled in Python)Mark Visited
CthreadMark Visited
CthreadNext Node Addr

UpdateNodeMark Visited

OutStream

OutStream

Read Node
CthreadPriority Queue Cthread

OutStream

Read Edge

Read NodePriority QueueInStream

InStream

Edge
Page
Addr

InStream

DMAC

DMAC

Next Node Cost

DMAC

+

DMAC

AXI4 Master Interfaces

SWEST2015

Shinya T-Y, NAISTFSM

Dijkstra
Logic(Modeled in Verilog
HDL)

Cost
Next Node Cost

Main
CThreadNext Node Addr

Node Addr

Node
Addr

Read Edge
Cthread

DMAC

DMAC

Slave I/F

AXI4-lite
Slave Interfaces

62

FPGAシステム開発で面倒なところn CPUや他のIPとの接続方法・インターフェース実装l IPコアのバスインターフェス：AXI4, Avalon• PyCoRAMならインターフェースもIPコア設定ファイルも自動生成n データの置き場・供給方法l オンチップメモリ（ブロックRAM）・DRAM• PyCoRAMならDRAM-オンチップメモリ間のデータ移動制御は
Pythonで書けて楽ちんn CPUとのデータ共有方法l OSなし：論理メモリ空間=物理メモリ空間なので簡単• volatileな変数を使えばOKl OSあり：仮想メモリが存在するため面倒• CPU: 仮想メモリあり，論理アドレスでアクセス• HW: 仮想メモリなし，物理アドレスでアクセス– 数MB以上の物理連続領域を確保するの小技が必要
SWEST2015

Shinya T-Y, NAIST

63

Zynq + PyCoRAM (+Debian) 入門n SlideShareでチュートリアルスライド公開中l http://www.slideshare.net/shtaxxx/zynqpycoramn 今時のFPGAアクセラレータを作る方法の一例をまとめましたl PyCoRAM IPコアの作り方l Zynq (ARM搭載FPGA)の上でDebian Linuxを動作させるにはl その上でPyCoRAM IPコアを使うにはどんなSWが必要かn 2015年3月時点の情報なのでそろそろ更新予定l Debian 7.0から8.0へ移行
l HW用メモリ領域確保の方法更新
SWEST2015

Shinya T-Y, NAIST

64

Pyverilog & Veriloggen

SWEST2015

Shinya T-Y, NAIST

65

Pyverilog: Verilog HDL解析・生成ツールキット
Parsermodule TOP(input CLK,
input RST,
output rslt, …

Verilog HDL
CodeLexicalAnalyzer

Code
Generator

SyntaxAnalyzer
AST

AST

module TOP(input CLK,
input RST,
output rslt, …

Verilog HDL
CodeDataflow Analyzer
ModuleAnalyzer

SignalAnalyzerBind
Analyzer

Visualizer
Dataflow

Graphical
OutputOptimizer

Control-flow Analyzer
StateMachinePattern
MatcherSWEST2015

Input

ActiveCondition
Analyzer

OutputControl-flow

Shinya T-Y, NAIST

66

構文解析・抽象構文木(AST)生成
stopwatch.v
11 17, 14 17:10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

SWEST2015

module stopwatch(
input CLK,
input RST,
input start,
input stop,
input init,
output reg busy,
output reg [31:0] timecount);localparam IDLE = 0;
localparam COUNTING = 1;
localparam WAITINIT = 2;
reg [3:0] state;
always @(posedge CLK) begin
if(RST) begin
state <= 0;
timecount <= 0;
end else begin
if(state == IDLE) begin
if(start) begin
state <= COUNTING;
timecount <= 0;busy <= 1;
end
end else if(state == COUNTING) begin
timecount <= timecount + 1;
if(stop) begin
state <= WAITINIT;
busy <= 0;
end
end else if(state == WAITINIT) begin
if(init) begin
timecount <= 0;state <= IDLE;
end else if(start) begin
timecount <= 0;state <= COUNTING;
end
end
end
end
endmodule

Verilog HDL
ソースコード変換

Shinya T-Y, NAIST

Page 1/1

Source:Description:
ModuleDef: stopwatch
Paramlist:
Portlist:
Ioport:Input: CLK, False
Width:
IntConst: 0
IntConst: 0
Ioport:Input: RST, False
Width:
IntConst: 0
IntConst: 0
Ioport:Input: start, False
Width:
IntConst: 0
IntConst: 0
Ioport:Input: stop, False
Width:
IntConst: 0
IntConst: 0
Ioport:Input: init, False
Width:
IntConst: 0
IntConst: 0
Ioport:Output: busy, False
Width:
IntConst: 0
IntConst: 0
Reg: busy, False
Width:
IntConst: 0
IntConst: 0
Ioport:Output: timecount, False
Width:
IntConst: 31
IntConst: 0
Reg: timecount, False
Width:
IntConst: 31
IntConst: 0

AST

67

データフロー解析
stopwatch.timecountBranchstopwatch_RSTCOND TRUE

FALSE

’d0

Branch
COND

FALSE

Eq

BranchCOND TRUE

TRUE

’d0

Eq

FALSE

Plus

Branch
COND

’d1

’d1

TRUE

Eq

BranchFALSE

BranchTRUE

SWEST2015’d0

stopwatch_state

’d2

FALSE

COND
stopwatch_timecountShinya T-Y, NAISTCOND TRUE
stopwatch_init

FALSE

’d0
FALSE

stopwatch_start

Branch
COND

TRUE
’d0

68

制御フロー（状態遷移）解析
n 状態遷移（いつ・どこからどこへ）を解析
0# SIGNAL NAME: stopwatch.state# DELAY CNT: 0
GreaterThan
0 --(stopwatch_start>'d0)--> 1
1 --(stopwatch_stop>'d0)--> 2
2 --(stopwatch_init>'d0)--> 0
1
GreaterThan
2 --((!(stopwatch_init>'d0))&&(stopwatch_start>'d0))--> 1
Loop
GreaterThan Land(0, 1, 2)(1, 2)
2(a) Command Line Output(b) Graphical Output

n ある信号が活性化する条件を解析
Active Conditions: stopwatch.busy[((stopwatch_start 1:None) && (stopwatch_state 0:0))]
Changed Conditions[((stopwatch_start 1:None) && (stopwatch_state 0:0)), ((stopwatch_state 1:1) && (stopwatch_stop 1:None))]Changed Condition Dict[(((stopwatch_start 1:None) && (stopwatch_state 0:0)), 'd1), (((stopwatch_state 1:1) && (stopwatch_stop 1:None)), 'd0)]
Condition
Signal

SWEST2015

AND
Condition’sTarget
Min/Max Condition Signal
Values

Target’s
Assigned
Value

Shinya T-Y, NAIST69

PythonでVerilog HDLのコード生成
11 19, 14
13:53
Python1
2

codegen.py

import pyverilog.vparser.ast as vastfrom pyverilog.ast_code_generator.codegen import ASTCodeGenerator

3
4
5
6
7
8
9
10
11

params = vast.Paramlist(())
clk = vast.Ioport( vast.Input(’CLK’) )rst = vast.Ioport( vast.Input(’RST’) )width = vast.Width( vast.IntConst(’7’), vast.IntConst(’0’) )led = vast.Ioport( vast.Output(’led’, width=width) )ports = vast.Portlist( (clk, rst, led) )items = ( vast.Assign( vast.Identifier(’led’), vast.IntConst(’8’) ) ,)ast = vast.ModuleDef("top", params, ports, items)

12
13
14
15

codegen = ASTCodeGenerator()
rslt = codegen.visit(ast)print(rslt)

HDL
11Verilog
19, 14 14:15
12
3
4

Execute56
7
8

SWEST2015

これをベースに抽象度の高いHDLを作りたい
generated.v

module top(
input [0:0] CLK,
input [0:0] RST,
output [7:0] led);
assign led = 8;
endmodule
Shinya T-Y, NAIST

Veriloggen
70

Veriloggen

PythonVerilog HDL

PythonでVerilog HDLを組み立てるライブラリn Pythonで書いた動作をHDLに変換する
高位合成ではないn PythonのオブジェクトとしてVerilogの信号や代入を組み上げていく

実行n 当該オブジェクトの
to_verilog() を呼ぶとVerilogのソースコードのテキストに変換

SWEST2015

Shinya T-Y, NAIST71

例）たくさんLEDを追加してみる

実行

SWEST2015

Shinya T-Y, NAIST

72

Veriloggenで何ができるか？
n Verilog HDLのメタプログラミングができるl 例）回路生成するレシピをPython+Veriloggenで定義してアプリケーション規模に応じて回路を自動生成• Verilog HDLにはgenerate構文があるか機能は限定的

n 独自の高位合成コンパイラのバックエンドとして使えるl （PyCoRAMではない）Pythonベースの高位合成ツールとか？
l Post PyCoRAMを現在開発中･･･こうご期待• 制御とパイプラインを柔軟に結合する仕組み• 既存のVerilog HDL資源を再利用する仕組み

SWEST2015

Shinya T-Y, NAIST

73

今後の高位合成ツールは
どうあるべきか？

SWEST2015

Shinya T-Y, NAIST74

私が思う今後の高位合成の要件（まじめな話）n オープンソースであるl 普段よく使うコンパイラの多くはオープンソース• GCCやLLVM、最近は.NETすらオープンソースにl 誰でもすぐ導入できるのは正義• 今はFPGAの評価ボードも安価である：2万5千円でZyboが買えるn ソフトウェア開発者が自然に導入できるl 記述モデル：結局、手続き型＋オブジェクト指向がよい？
• より多くの人が使える• 慣れ親しんだプログラミングモデル＝手になじんでいるl 多少のディレクティブは許容される• GPUではCUDAが当たり前• FPGAでもOpenACC，OpenMPやMPI程度なら許されるか？
– Xilinx SDSoCは近いかも？
SWEST2015

Shinya T-Y, NAIST

75

私が思う今後の高位合成の要件（まじめな話）

n 高位合成系におけるLLVM的環境l データフローを入力したらスケジューリング・アロケーション
してくれるフレームワーク・足回り• LLVM: LLVM-IRを入力に最適化したり機械語を吐いたり• DFGレベルのスケジューリング・最適化をやってくれるl 言語や記述モデルでオリジナリティを出す• 粗粒度・スレッドレベルなスケジューリングは自分でSWEST2015

Shinya T-Y, NAIST

76

今日のテーマn 「好きな道具」で「好きなもの」を作る世界l 発表者の場合• 好きな道具: 好きな言語（Python）・モデル・書き方• 好きなもの: FPGAを使ったカスタムコンピュータn 「こんな風に設計できたらいいな」を実現しようl 自分の手になじむ道具を実際に作ろう、そして公開しようl 発表者の場合• PyCoRAM: PythonによるIPコア高位設計フレームワーク• Pyverilog: Verilog HDL解析・生成ツールキット• Veriloggen: PythonでVerilog HDLを組み立てる軽量ライブラリ

SWEST2015

Shinya T-Y, NAIST77

私が思う今後の高位合成の要件（気楽な話）n 好きな言語でハードウェア開発できるl ソフトウェア開発は用途と好みに応じて言語を選べる• C, C++, C#, Java, Python, Ruby, Perl, JavaScrit, Scala, Go, Haskelll ハードウェア開発は？→選択肢が少ない• RTL: Verilog HDL, VHDL
• 高級HDL: Chisel (Scala DSL), PyMTL (Python DSL), Veriloggen• 高位合成: C, C++, OpenCL, Java (Synthesijer), Python (PyCoRAM)n 「好きな道具」で「好きなもの」を作る世界• 高位設計 ≠ C設計（Cベースが現状一番良いのは認める）• でもRubyで書きたい！Goで書きたい！Pythonで書きたい！
– 発表者はPythonで書きたいのでこれからもいろいろやってみます– でも他の言語も検討中です
SWEST2015

Shinya T-Y, NAIST

78

「こんな風に設計できたらいいな」を実現しようn 自分が使いたい道具を自分で作ろうl こんな風に回路が書けたらいいなl あの言語でハードウェアを生成したいl でもそんな道具ない･･･じゃあ作りましょう！
• 公開したら誰かが使ってくれるかも？

n （特に学生さん）研究になるか？
l 研究：基礎研究・応用研究・開発研究• 新しいもの・自分がワクワクするものを開発して
ああでもないこうでもないと検証していくのは開発研究l 新規性とか有用性とかは？
• 新規性：ちゃんと作れば何かしらある• 有用性：少なくとも自分には有用
SWEST2015

Shinya T-Y, NAIST

79

まとめ

n FPGA・高位合成の基礎とPythonによる高位設計フレームワークについてn 今後の高位合成ツールはどうあるべきか？
l 「こんな風に設計できたらいいな」を実現しようn 各種ツールはGitHubで公開中
l PyCoRAM: https://github.com/PyHDI/PyCoRAMl Pyverilog: https://github.com/PyHDI/Pyverilogl Veriloggen: https://github.com/PyHDI/veriloggen

SWEST2015

Shinya T-Y, NAIST

80