PythonとPyCoRAM
(とPyverilogとVeriloggen)で
お手軽にFPGAシステムを
開発してみよう
高前田 伸也 (@shtaxxx)
奈良先端科学技術大学院大学 情報科学研究科
E-mail: shinya_at_is...
Who am I?
n  高前田 伸也 (Shinya Takamaeda)
l  Twitter/GitHub: @shtaxxx
n  奈良先端科学技術大学院大学 (NAIST)
情報科学研究科 助教
n  研究テーマ
l  コン...
今日のテーマ
n  「好きな道具」で「好きなもの」を作る世界
l  発表者の場合
•  好きな道具: 好きな言語(Python)・モデル・書き方
•  好きなもの: FPGAを使ったカスタムコンピュータ
n  「こんな風に設計できたらいい...
All software are available!
n  GitHubで公開中
l  PyCoRAM: https://github.com/PyHDI/PyCoRAM
l  Pyverilog: https://github.com...
目次
n  FPGAとは?
n  高位合成ツールとは?
n  Pythonによる高位設計フレームワークPyCoRAM
l  PythonとVerilog HDLを組み合わせたIPコア設計ツール
n  関連ツールの紹介
l  Pyve...
FPGAとは?
PyCon JP 2015 Shinya T-Y, NAIST 6
ヘテロジニアスコンピューティング
OoO
Core
OoO
Core
OoO
Core
OoO
Core
L2 L2 L2 L2
L3 Cache
DDR3 DRAM
Multicore (Intel Corei7)
L2 Cache
GDDR...
FPGA (Field Programmable Gate Array)
n  中身を改変可能なLSI
(PLD: Programmable Logic Device)
l  設計者が独自のデジタル回路を形成することができる
l  対して...
FPGAボードの基礎
FPGA
(Xilinx Virtex-7 XC7V690T)
DDR3 SODIMM
(4GB x2)
PCI-express10Gbps Ethernet x4
SATA-3 x2
Digilent NetFPGA S...
PyCon JP 2015 Shinya T-Y, NAIST 10
SSD
FPGA (Xilinx Zynq 7020, ARM Dualcore)
+DDR3 DRAM 512MB
SSD Interface
Digilent ZedBo...
PyCon JP 2015 Shinya T-Y, NAIST 11
Xilinx ZC706
FPGA: Xilinx Zynq 7045
Size: Pipelined CPU ×16
Price: 300,000yen
ScalableCore System
FPGA: Xilinx Spartan-6 ×100
Size: Pipelined CPU x200?
Price: 100万円程度?
PyCon JP 2015 Shinya T-Y, NAIST ...
アイランドスタイルFPGAの構成
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
SB
CB
CB
LB
SB
CB
CB
...
アイランドスタイルFPGAの構成
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
CB
LB
SB
CB
SB
CB
CB
LB
SB
CB
CB
...
ARM搭載FPGAの登場
n  ARMプロセッサ+FPGA (Xilinx Zynq, Altera SoC)
l  専用インターコネクトで密結合,キャッシュ・DRAM共有
l  普通のLinuxが動作する→大量なソフトウェア資源が利用可...
アプリケーションの変化
n  以前は画像処理やネットワーキングなどが主流
n  「ビッグデータ」指向へ: 脱ノイマン型?
l  イーサネットNICでMemcached [Fukuda+, FPL’14]
l  Microsoft Bin...
How to Develop a Software?
Writing a software
in programming languages
Preprocess
Compile
Assemble
Link
CompilerFlow
Execu...
How to Develop a (FPGA) Hardware?
Writing a hardware design in HDL
(Hardware Description Language)
Synthesis
Technology Ma...
高位合成のあれこれ
PyCon JP 2015 Shinya T-Y, NAIST 19
高位合成とは?
n  動作モデルからRTLモデルを
生成するツール・コンパイラ
l  入力: ソフトウェアのソースコード
•  C, C++, OpenCL, Java, Python, ...
l  出力: RTL(HDLソースコード)...
例:2配列の積和演算 (c += a * b)
PyCon JP 2015 Shinya T-Y, NAIST 21
積和演算器(トップレベル) 乗算器
RTL設計 (Verilog HDL): 105行,2098文字,15分
「いつ」「なに」...
例:2配列の積和演算 (c += a * b)
PyCon JP 2015 Shinya T-Y, NAIST 22
高位設計 (C言語): 11行,163文字,1分
→1/10の記述量と1/15の開発時間
(ただしディレクティブ等はなし)
(...
FPGA向け商用高位合成ツールが多数登場
n  Xilinx Vivado HLS (+ SDSoC)
l  C/C++で振る舞いを定義・ディレクティブで性能チューニング
l  SDSoCならSWコードから部分的にHW化・I/Fも自動生成...
オープンソースな高位合成ツールの登場
n  LegUp: トロント大で開発されているCベース処理系
l  C記述をMIPS CPU用SW部とHW部に自動分割・論文多数
n  Synthesijer: Javaによる高位合成処理系
l  ...
PyCoRAM
Pythonによるハードウェア
IPコア設計フレームワーク
PyCon JP 2015 Shinya T-Y, NAIST 25
背景
n  CPU with IP-cores
l  ハードマクロCPU (ARM) 搭載FPGAが主流に: Xilinx Zynq, etc
l  専用HWはIPコアとして実装し
インターコネクト(AXI4やAvalon)を介してCPU...
PyCoRAM [Takamaeda+,CARL’13]
n  抽象化されたインターコネクトとメモリシステムの上で
IPコアを開発するフレームワーク
l  標準的なインターコネクトに繋げる:AMBA AXI4, Altera Avalon
...
PyCoRAM:フレームワーク構成
n  入力:2種類のソースコード
l  データフロー(演算パイプライン):Verilog HDL
l  データ転送制御:Python
n  出力:演算パイプと制御機構を持つIPコア
l  DMAを主...
PyCoRAM:アーキテクチャ
PyCon JP 2015 Shinya T-Y, NAIST 29
データパス 制御
Memory/Stream DMAコントローラ
Channel/
Register
IOChannel/
IORegister
PyCoRAM:アーキテクチャ
PyCon JP 2015 Shinya T-Y, NAIST 30
データパス 制御
Memory/Stream DMAコントローラ
Channel/
Register
IOChannel/
IORegiste...
PyCoRAM:アーキテクチャ
PyCon JP 2015 Shinya T-Y, NAIST 31
データパス 制御
Memory/Stream DMAコントローラ
Channel/
Register
IOChannel/
IORegiste...
PyCoRAM:アーキテクチャ
PyCon JP 2015 Shinya T-Y, NAIST 32
データパス 制御
Memory/Stream DMAコントローラ
Channel/
Register
オンチップ・インターコネクト
メインメモ...
PyCoRAM:アーキテクチャ
PyCon JP 2015 Shinya T-Y, NAIST 33
データパス 制御
Memory/Stream DMAコントローラ
Channel/
Register
オンチップ・インターコネクト
メインメモ...
PyCoRAMにおけるIPコアの作り方・でき方
n  2種類のファイルを用意する
l  Verilog HDL: 計算ロジック(データパス)
l  Python: コントロールスレッド(制御)
n  PyCoRAMが自動的にIPコアのパ...
Pythonによるコントロールスレッド
n  PyCoRAMオブジェクトに対する処理を記述する
l  CoramMemory: read(), write()
•  MemoryとDRAMとの間のDMA転送によるデータ移動
l  Cora...
例: 配列の和を求めるアクセラレータ
n  1メモリ+1スレッドの簡単なハードウェア
l  CoramMemoryにDRAMからデータを読み込む
l  スレッド側でCoramMemory-DRAM間のデータ転送系列を表現
Computin...
計算ロジック (1): I/Oポート
クロック(CLK)とリセット(RST)
以外に専用のI/Oは不要
CoramMemoryのための信号
(BRAMと同じインターフェース)
CoramChannelのための信号
(FIFOと同じインターフェー...
計算ロジック (2): パイプライン/FSM
CoramChannelに書き込み
(コントロールスレッドに通知)
CoramChannelから読み出し
(コントロールスレッドから受信)
PyCon JP 2015 Shinya T-Y, NAI...
計算ロジック (3): 子インスタンス
CoramMemory
(BRAMと同じインターフェース)
CoramChannel
(FIFOと同じインターフェース)
PyCon JP 2015 Shinya T-Y, NAIST 39
コントロールスレッド (Python)
ram (CoramMemory)とchannel (CoramChannel)の宣言
CoramMemoryにDMA転送したり
CoramChannelから読んだり書いたり
PyCon JP 2015 ...
コンパイル
PyCon JP 2015 Shinya T-Y, NAIST 41
シミュレーション結果
PyCon JP 2015 Shinya T-Y, NAIST 42
シミュレーション結果(波形)
PyCon JP 2015 Shinya T-Y, NAIST 43
Zynq + PyCoRAM (+Debian) 入門
n  SlideShareでチュートリアルスライド公開中
l  http://www.slideshare.net/shtaxxx/zynqpycoram
n  今時のFPGAアクセ...
Pythonの抽象構文木 (AST)
PyCon JP 2015 Shinya T-Y, NAIST 45
Pythonの抽象文法 (Abstract Grammar)
PyCon JP 2015 Shinya T-Y, NAIST 46
http://docs.python.jp/3.4/library/ast.html
PyCon JP 2015 Shinya T-Y, NAIST 47
a+b, a*b
a, hoge
astとinspectでソースを探る
n  inspect.getsource(obj)
l  オブジェクトをソースコードに変換
n  ast.parse(src)
l  ソースコードを抽象構文木に変換
n  ast.dump(nod...
VisitorパターンでASTを辿る (1)
PyCon JP 2015 Shinya T-Y, NAIST 49
VisitorパターンでASTを辿る (2)
PyCon JP 2015 Shinya T-Y, NAIST 50
各ノードに対応する
メソッドを書く
Pyverilog & Veriloggen
PyCon JP 2015 Shinya T-Y, NAIST 51
Pyverilog: Verilog HDL解析・生成ツールキット
PyCon JP 2015 Shinya T-Y, NAIST 52
Module
Analyzer
Syntax
Analyzer
Lexical
Analyzer
AST
...
構文解析・抽象構文木(AST)生成
PyCon JP 2015 Shinya T-Y, NAIST 53
1 module stopwatch
2 (
3 input CLK,
4 input RST,
5 input start,
6 inp...
データフロー解析
PyCon JP 2015 Shinya T-Y, NAIST 54
stopwatch.timecount
Branch
stopwatch_RST
COND
’d0
TRUE
Branch
FALSE
Eq
COND
Br...
制御フロー(状態遷移)解析
n  状態遷移(いつ・どこからどこへ)を解析
n  ある信号が活性化する条件を解析
PyCon JP 2015 Shinya T-Y, NAIST 55
0
1
GreaterThan
2
GreaterThan...
PythonでVerilog HDLのコード生成
1 import pyverilog.vparser.ast as vast
2 from pyverilog.ast_code_generator.codegen import ASTCode...
Veriloggen
PyCon JP 2015 Shinya T-Y, NAIST 57
実行
Verilog HDLPython
PythonでVerilog HDLを
組み立てるライブラリ
n  Pythonで書いた動作を
HDLに変換...
例)たくさんLEDを追加してみる
PyCon JP 2015 Shinya T-Y, NAIST 58
実行
Veriloggenで何ができるか?
n  Verilog HDLのメタプログラミングができる
l  例)回路生成するレシピをPython+Veriloggenで定義して
アプリケーション規模に応じて回路を自動生成
•  Verilog H...
今後の高位合成ツールは
どうあるべきか?
PyCon JP 2015 Shinya T-Y, NAIST 60
私が思う今後の高位合成の要件(まじめな話)
n  オープンソースである
l  普段よく使うコンパイラの多くはオープンソース
l  誰でもすぐ導入できるのは正義
•  今はFPGAの評価ボードも安価である
n  ソフトウェア開発者が自然に...
私が思う今後の高位合成の要件(まじめな話)
n  高位合成系におけるLLVM的環境
l  データフローを入力したらスケジューリング・アロケーション
してくれるフレームワーク・足回り
•  LLVM: LLVM-IRを入力に最適化したり機械語...
私が思う今後の高位合成の要件(気楽な話)
n  好きな言語でハードウェア開発できる
l  ソフトウェア開発は用途と好みに応じて言語を選べる
•  C, C++, C#, Java, Python, Ruby, Perl, JavaScrit...
まとめ
n  FPGA・高位合成の基礎と
Pythonによる高位設計フレームワークについて
l  「こんな風に設計できたらいいな」を実現しよう
n  各種ツールはGitHubで公開中
l  PyCoRAM: https://github...
Upcoming SlideShare
Loading in...5
×

PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう

1,730

Published on

PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう @PyCon JP 2015 (2015年10月11日) #pyconjp

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,730
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう

  1. 1. PythonとPyCoRAM (とPyverilogとVeriloggen)で お手軽にFPGAシステムを 開発してみよう 高前田 伸也 (@shtaxxx) 奈良先端科学技術大学院大学 情報科学研究科 E-mail: shinya_at_is_naist_jp 2015年10月11日 13:40-14:10 PyCon JP 2015
  2. 2. Who am I? n  高前田 伸也 (Shinya Takamaeda) l  Twitter/GitHub: @shtaxxx n  奈良先端科学技術大学院大学 (NAIST) 情報科学研究科 助教 n  研究テーマ l  コンピュータアーキテクチャ l  メモリシステム l  ネットワークオンチップ l  FPGAシステム l  高位合成コンパイラ PyCon JP 2015 Shinya T-Y, NAIST 2
  3. 3. 今日のテーマ n  「好きな道具」で「好きなもの」を作る世界 l  発表者の場合 •  好きな道具: 好きな言語(Python)・モデル・書き方 •  好きなもの: FPGAを使ったカスタムコンピュータ n  「こんな風に設計できたらいいな」を実現しよう l  自分の手になじむ道具を実際に作ろう、そして公開しよう l  発表者の場合 •  PyCoRAM: PythonによるIPコア高位設計フレームワーク •  Pyverilog: Verilog HDL解析・生成ツールキット •  Veriloggen: PythonでVerilog HDLを組み立てる軽量ライブラリ PyCon JP 2015 Shinya T-Y, NAIST 3
  4. 4. All software are available! n  GitHubで公開中 l  PyCoRAM: https://github.com/PyHDI/PyCoRAM l  Pyverilog: https://github.com/PyHDI/Pyverilog l  Veriloggen: https://github.com/PyHDI/veriloggen n  PIP(Pythonパッケージ管理)でもインストール可 l  ただしGitHubが最新版です PyCon JP 2015 Shinya T-Y, NAIST 4 $ pip install pyverilog� $ pip install pycoram� $ pip install 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�
  5. 5. 目次 n  FPGAとは? n  高位合成ツールとは? n  Pythonによる高位設計フレームワークPyCoRAM l  PythonとVerilog HDLを組み合わせたIPコア設計ツール n  関連ツールの紹介 l  Pyverilog, Veriloggen n  まとめ PyCon JP 2015 Shinya T-Y, NAIST 5
  6. 6. FPGAとは? PyCon JP 2015 Shinya T-Y, NAIST 6
  7. 7. ヘテロジニアスコンピューティング OoO Core OoO Core OoO Core OoO Core L2 L2 L2 L2 L3 Cache DDR3 DRAM Multicore (Intel Corei7) L2 Cache GDDR5 DRAM GPU (NVIDIA GeForce) DDR3 DRAM Manycore (Intel Xeon Phi) DDR3 DRAM FPGA (Xilinx Virtex-7) PyCon JP 2015 Shinya T-Y, NAIST 7
  8. 8. 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 PyCon JP 2015 Shinya T-Y, NAIST 8
  9. 9. FPGAボードの基礎 FPGA (Xilinx Virtex-7 XC7V690T) DDR3 SODIMM (4GB x2) PCI-express10Gbps Ethernet x4 SATA-3 x2 Digilent NetFPGA SUME Price $24,500 PyCon JP 2015 Shinya T-Y, NAIST 9
  10. 10. PyCon JP 2015 Shinya T-Y, NAIST 10 SSD FPGA (Xilinx Zynq 7020, ARM Dualcore) +DDR3 DRAM 512MB SSD Interface Digilent ZedBoard FPGA: Xilinx Zynq 7020 Size: Pipelined CPU ×8 (+ ARM DualCore) Price: 60,000yen (Academic)
  11. 11. PyCon JP 2015 Shinya T-Y, NAIST 11 Xilinx ZC706 FPGA: Xilinx Zynq 7045 Size: Pipelined CPU ×16 Price: 300,000yen
  12. 12. ScalableCore System FPGA: Xilinx Spartan-6 ×100 Size: Pipelined CPU x200? Price: 100万円程度? PyCon JP 2015 Shinya T-Y, NAIST 12
  13. 13. アイランドスタイルFPGAの構成 SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB SB CB SB CB SB IOB IOB IOB IOB IOB IOB IOBIOBIOB IOBIOBIOB FPGA SB LB CB IOB Logic Block Switch Block Connection Block I/O Block Wire •  An LB has logical circuit components for both combinational circuits and sequential circuits •  They are connected via interconnection components (SB, CB and wire) PyCon JP 2015 Shinya T-Y, NAIST 13
  14. 14. アイランドスタイルFPGAの構成 SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB CB LB SB CB CB LB SB CB CB LB SB CB SB CB SB CB SB CB SB IOB IOB IOB IOB IOB IOB IOBIOBIOB IOBIOBIOB FPGA SB LB CB IOB Logic Block Switch Block Connection Block I/O Block Wire •  An LB has logical circuit components for both combinational circuits and sequential circuits •  They are connected via interconnection components (SB, CB and wire) PyCon JP 2015 Shinya T-Y, NAIST 14
  15. 15. ARM搭載FPGAの登場 n  ARMプロセッサ+FPGA (Xilinx Zynq, Altera SoC) l  専用インターコネクトで密結合,キャッシュ・DRAM共有 l  普通のLinuxが動作する→大量なソフトウェア資源が利用可能 Zynq-7000 All Programmable SoC http://japan.xilinx.com/products/silicon-devices/soc/zynq-7000.html AlteraのARMベースSoC https://www.altera.com/ja_JP/pdfs/literature/br/br-soc-fpga_j.pdf PyCon JP 2015 Shinya T-Y, NAIST 15
  16. 16. アプリケーションの変化 n  以前は画像処理やネットワーキングなどが主流 n  「ビッグデータ」指向へ: 脱ノイマン型? l  イーサネットNICでMemcached [Fukuda+, FPL’14] l  Microsoft Bing search engine (Catapult) [Putnam+, ISCA'14] •  FPGA間を専用線で接続するクラスタシステム PyCon JP 2015 Shinya T-Y, NAIST 16Fig1 from [Putman+, ISCA'14]Fig2 from [Fukuda+, FPL'14]
  17. 17. How to Develop a Software? Writing a software in programming languages Preprocess Compile Assemble Link CompilerFlow Execution on a CPU int main(){� int a = 1 + 2;� printf(“Hello %dn”, a);� return 0;� }� add $t0, $t1, $t2� li $v0, 1� syscall� ELF01ABF00F1...� Executable Binary PyCon JP 2015 Shinya T-Y, NAIST 17
  18. 18. How to Develop a (FPGA) Hardware? Writing a hardware design in HDL (Hardware Description Language) Synthesis Technology Mapping Place and Route Bitstream Generation EDAFlow Configuration of the bitstream to an FPGA module top� (input CLK, RST, � output reg [7:0] LED);� always @(posedge CLK) begin� LED <= LED + 1;� end� endmodule� 1A0C021E...� Original HW on an FPGA Bitstream PyCon JP 2015 Shinya T-Y, NAIST 18
  19. 19. 高位合成のあれこれ PyCon JP 2015 Shinya T-Y, NAIST 19
  20. 20. 高位合成とは? n  動作モデルからRTLモデルを 生成するツール・コンパイラ l  入力: ソフトウェアのソースコード •  C, C++, OpenCL, Java, Python, ... l  出力: RTL(HDLソースコード) •  Verilog HDL, VHDL n  構成:SWコンパイラと同等の フロントエンドと高位合成 ならではのバックエンド l  フロントエンド: 抽象構文木(AST)生成・ コントロールデータフロー(CDFG)解析 l  バックエンド: 「いつ」「どの演算」を するか決めたり、演算を演算器に、 変数をレジスタに割り当てり PyCon JP 2015 Shinya T-Y, NAIST 20 ソースコード 構文解析 コントロール・ データフロー解析 スケジューリング アロケーション 制御回路生成 コード生成 RTL フロント エンドバックエンド
  21. 21. 例:2配列の積和演算 (c += a * b) PyCon JP 2015 Shinya T-Y, NAIST 21 積和演算器(トップレベル) 乗算器 RTL設計 (Verilog HDL): 105行,2098文字,15分 「いつ」「なに」を 「どのように」するかを 設計者が決める
  22. 22. 例:2配列の積和演算 (c += a * b) PyCon JP 2015 Shinya T-Y, NAIST 22 高位設計 (C言語): 11行,163文字,1分 →1/10の記述量と1/15の開発時間 (ただしディレクティブ等はなし) (性能が出れば)高位設計最高! 「なに」をするかだけを 設計者が決める
  23. 23. 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 SDAccel l  ホストPCありき・ホストPC上SWのお作法も定義 https://www.youtube.com/ watch?v=URUVkq6zQhQ PyCon JP 2015 Shinya T-Y, NAIST 23
  24. 24. オープンソースな高位合成ツールの登場 n  LegUp: トロント大で開発されているCベース処理系 l  C記述をMIPS CPU用SW部とHW部に自動分割・論文多数 n  Synthesijer: Javaによる高位合成処理系 l  Java言語仕様に改変なし,サブセットをそのまま合成可能 9 クイックスタート 5/8 (5) 間隔をおいて変数ledをtrue/falseするプログラムを書く Lチカに相当する変数 適当なウェイト 点滅 自動コンパイルが裏で動くので,Javaコードとしての正しさは 即座にチェックされる 2 Synthesijer とは ✔ JavaプログラムをFPGA上のハードウェアに変換 ✔ 複雑なアルゴリズムのハードウェア実装を楽に ✔ オブクジェクト指向設計による再利用性の向上 ✔ 特殊な記法,追加構文はない ✔ ソフトウェアとして実行可能.動作の確認、検証が容易 ✔ 書けるプログラムに制限は加える (動的なnew,再帰は不可など) Javaコンパイラ フロントエンド Synthesijer エンジン Javaコンパイラ バックエンド 合成 配置配線 while(){ if(...){ … }else{ … … } …. } 複雑な状態遷移も,Javaの制御構文を使って楽に設計できる 同じJavaプログラムをソフトウェアとしても FPGA上のハードウェアとしても実行可能 Open-source http://www.sigemb.jp/ESS/2014/files/IPSJ-ESS2014003-1.pdf PyCon JP 2015 Shinya T-Y, NAIST 24
  25. 25. PyCoRAM Pythonによるハードウェア IPコア設計フレームワーク PyCon JP 2015 Shinya T-Y, NAIST 25
  26. 26. 背景 n  CPU with IP-cores l  ハードマクロCPU (ARM) 搭載FPGAが主流に: Xilinx Zynq, etc l  専用HWはIPコアとして実装し インターコネクト(AXI4やAvalon)を介してCPUと接続 n  どのようにしてアクセラレータIPコアを設計するか? l  HDLですべて設計するのは大変 •  例)演算とメモリアクセスのスケジューリング –  ダブルバッファリングとか面倒 –  HDLでステートマシンを書くのは大変だし間違えやすい l  性能を出すには高稼働率パイプラインとデータ供給機構が必要 •  ストールのない綺麗なパイプラインを定義したい: HDLが得意 •  (OSSな)高位合成系だとチューニングが難しい n  →データ転送を抽象化すれば幸せそう? PyCon JP 2015 Shinya T-Y, NAIST 26
  27. 27. PyCoRAM [Takamaeda+,CARL’13] n  抽象化されたインターコネクトとメモリシステムの上で IPコアを開発するフレームワーク l  標準的なインターコネクトに繋げる:AMBA AXI4, Altera Avalon l  ポータブル:抽象化がプラットフォームの違いを吸収 l  CPUや他のIPコアと共存が容易:ビルディングブロック開発 PyCon JP 2015 Shinya T-Y, NAIST 27 On-chip Interconnect (AXI4, Avalon) PyCoRAM Abstraction Accelerator logic Standard IP-core Device-dependent Interfaces (DRAM, etc) CPU Portable application with PyCoRAM Cooperation with standard IP-cores
  28. 28. PyCoRAM:フレームワーク構成 n  入力:2種類のソースコード l  データフロー(演算パイプライン):Verilog HDL l  データ転送制御:Python n  出力:演算パイプと制御機構を持つIPコア l  DMAを主体としたデータ転送重点型ハードウェアが合成される PyCon JP 2015 Shinya T-Y, NAIST 28 データフロー (Verilog HDL) 制御フロー (Python) HW 構造 解析 RTL 変換 制解 対象 解析 高位 合成 処理系 による RTL化 インター フェース 合成 ・ IPコア パッケー ジ化 PyCoRAMコンパイルフロー 入力: 高抽象度 デザイン 出力: 演算パイプライン+データ供給エンジンを 持つアクセラレータIPコア・システム データパス 制御 Memory/Stream DMAコントローラ Channel/ Register オンチップ・インターコネクト メインメモリ (DRAM) IPコア IOChannel/ IORegister
  29. 29. PyCoRAM:アーキテクチャ PyCon JP 2015 Shinya T-Y, NAIST 29 データパス 制御 Memory/Stream DMAコントローラ Channel/ Register IOChannel/ IORegister
  30. 30. PyCoRAM:アーキテクチャ PyCon JP 2015 Shinya T-Y, NAIST 30 データパス 制御 Memory/Stream DMAコントローラ Channel/ Register IOChannel/ IORegister Computing Logic Modeled in Verilog HDL Control Thread Modeled in Python
  31. 31. PyCoRAM:アーキテクチャ PyCon JP 2015 Shinya T-Y, NAIST 31 データパス 制御 Memory/Stream DMAコントローラ Channel/ Register IOChannel/ IORegister Memory: ロジック用ローカルメモリ Stream: ロジック用FIFO Channel: ロジック-スレッド間FIFO Register: ロジック-スレッド間共有レジスタ IO Channel: 外部制御用FIFO IO Register: 外部制御用共有レジスタ
  32. 32. PyCoRAM:アーキテクチャ PyCon JP 2015 Shinya T-Y, NAIST 32 データパス 制御 Memory/Stream DMAコントローラ Channel/ Register オンチップ・インターコネクト メインメモリ (DRAM) IOChannel/ IORegister
  33. 33. PyCoRAM:アーキテクチャ PyCon JP 2015 Shinya T-Y, NAIST 33 データパス 制御 Memory/Stream DMAコントローラ Channel/ Register オンチップ・インターコネクト メインメモリ (DRAM) IOChannel/ IORegister Master Interface メモリへ能動的にアクセス Slave Interface CPUからアクセスされる
  34. 34. PyCoRAMにおけるIPコアの作り方・でき方 n  2種類のファイルを用意する l  Verilog HDL: 計算ロジック(データパス) l  Python: コントロールスレッド(制御) n  PyCoRAMが自動的にIPコアのパッケージを作成 l  Python-Verilog高位合成とRTL変換を自動で行う 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)� PyCon JP 2015 Shinya T-Y, NAIST 34
  35. 35. Pythonによるコントロールスレッド n  PyCoRAMオブジェクトに対する処理を記述する l  CoramMemory: read(), write() •  MemoryとDRAMとの間のDMA転送によるデータ移動 l  CoramChannel: read(), write() •  計算ロジックとコントロールスレッドの間のデータのやりとり 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)� # Transfer (off-chip DRAM to BRAM) # Notification to User-logic # Wait for Notification from User-logic # $display Verilog system task � 0� 1� 2� 3� 4� 5� 6� 7� 8� 9� 10� 11� PyCon JP 2015 Shinya T-Y, NAIST 35
  36. 36. 例: 配列の和を求めるアクセラレータ n  1メモリ+1スレッドの簡単なハードウェア l  CoramMemoryにDRAMからデータを読み込む l  スレッド側でCoramMemory-DRAM間のデータ転送系列を表現 Computing Logic (Verilog HDL) Control Thread (Python) sum Coram Memory 0 + Control Logic Coram Channel 0 A PyCon JP 2015 Shinya T-Y, NAIST 36
  37. 37. 計算ロジック (1): I/Oポート クロック(CLK)とリセット(RST) 以外に専用のI/Oは不要 CoramMemoryのための信号 (BRAMと同じインターフェース) CoramChannelのための信号 (FIFOと同じインターフェース) ステートマシン用変数 PyCon JP 2015 Shinya T-Y, NAIST 37
  38. 38. 計算ロジック (2): パイプライン/FSM CoramChannelに書き込み (コントロールスレッドに通知) CoramChannelから読み出し (コントロールスレッドから受信) PyCon JP 2015 Shinya T-Y, NAIST 38
  39. 39. 計算ロジック (3): 子インスタンス CoramMemory (BRAMと同じインターフェース) CoramChannel (FIFOと同じインターフェース) PyCon JP 2015 Shinya T-Y, NAIST 39
  40. 40. コントロールスレッド (Python) ram (CoramMemory)とchannel (CoramChannel)の宣言 CoramMemoryにDMA転送したり CoramChannelから読んだり書いたり PyCon JP 2015 Shinya T-Y, NAIST 40
  41. 41. コンパイル PyCon JP 2015 Shinya T-Y, NAIST 41
  42. 42. シミュレーション結果 PyCon JP 2015 Shinya T-Y, NAIST 42
  43. 43. シミュレーション結果(波形) PyCon JP 2015 Shinya T-Y, NAIST 43
  44. 44. Zynq + PyCoRAM (+Debian) 入門 n  SlideShareでチュートリアルスライド公開中 l  http://www.slideshare.net/shtaxxx/zynqpycoram n  今時の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用メモリ領域確保の方法更新 PyCon JP 2015 Shinya T-Y, NAIST 44
  45. 45. Pythonの抽象構文木 (AST) PyCon JP 2015 Shinya T-Y, NAIST 45
  46. 46. Pythonの抽象文法 (Abstract Grammar) PyCon JP 2015 Shinya T-Y, NAIST 46 http://docs.python.jp/3.4/library/ast.html
  47. 47. PyCon JP 2015 Shinya T-Y, NAIST 47 a+b, a*b a, hoge
  48. 48. astとinspectでソースを探る n  inspect.getsource(obj) l  オブジェクトをソースコードに変換 n  ast.parse(src) l  ソースコードを抽象構文木に変換 n  ast.dump(node) l  ASTをテキスト形式でダンプ デバッグに便利 PyCon JP 2015 Shinya T-Y, NAIST 48
  49. 49. VisitorパターンでASTを辿る (1) PyCon JP 2015 Shinya T-Y, NAIST 49
  50. 50. VisitorパターンでASTを辿る (2) PyCon JP 2015 Shinya T-Y, NAIST 50 各ノードに対応する メソッドを書く
  51. 51. Pyverilog & Veriloggen PyCon JP 2015 Shinya T-Y, NAIST 51
  52. 52. Pyverilog: Verilog HDL解析・生成ツールキット PyCon JP 2015 Shinya T-Y, NAIST 52 Module Analyzer Syntax Analyzer Lexical Analyzer AST Signal Analyzer Bind Analyzer Dataflow State Machine Pattern Matcher Control-flow Optimizer Code Generator Active Condition Analyzer Visualizer Verilog HDL Code module TOP (input CLK, input RST, output rslt, … Graphical Output Verilog HDL Code module TOP (input CLK, input RST, output rslt, … Parser Dataflow Analyzer Control-flow Analyzer Input Output AST
  53. 53. 構文解析・抽象構文木(AST)生成 PyCon JP 2015 Shinya T-Y, NAIST 53 1 module stopwatch 2 ( 3 input CLK, 4 input RST, 5 input start, 6 input stop, 7 input init, 8 output reg busy, 9 output reg [31:0] timecount 10 ); 11 localparam IDLE = 0; 12 localparam COUNTING = 1; 13 localparam WAITINIT = 2; 14 reg [3:0] state; 15 always @(posedge CLK) begin 16 if(RST) begin 17 state <= 0; 18 timecount <= 0; 19 end else begin 20 if(state == IDLE) begin 21 if(start) begin 22 state <= COUNTING; 23 timecount <= 0; 24 busy <= 1; 25 end 26 end else if(state == COUNTING) begin 27 timecount <= timecount + 1; 28 if(stop) begin 29 state <= WAITINIT; 30 busy <= 0; 31 end 32 end else if(state == WAITINIT) begin 33 if(init) begin 34 timecount <= 0; 35 state <= IDLE; 36 end else if(start) begin 37 timecount <= 0; 38 state <= COUNTING; 39 end 40 end 41 end 42 end 43 endmodule 11 17, 14 17:10 Page 1/1stopwatch.v 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 変換 Verilog HDL ソースコード AST
  54. 54. データフロー解析 PyCon JP 2015 Shinya T-Y, NAIST 54 stopwatch.timecount Branch stopwatch_RST COND ’d0 TRUE Branch FALSE Eq COND Branch TRUE Branch FALSE stopwatch_state ’d0 stopwatch_start COND ’d0 TRUE stopwatch_timecount FALSE Eq COND Plus TRUE Branch FALSE ’d1 ’d1 FALSE Eq COND Branch TRUE ’d2 stopwatch_init COND ’d0 TRUE Branch FALSE CONDFALSE ’d0 TRUE
  55. 55. 制御フロー(状態遷移)解析 n  状態遷移(いつ・どこからどこへ)を解析 n  ある信号が活性化する条件を解析 PyCon JP 2015 Shinya T-Y, NAIST 55 0 1 GreaterThan 2 GreaterThan GreaterThan Land # SIGNAL NAME: stopwatch.state # DELAY CNT: 0 0 --(stopwatch_start>'d0)--> 1 1 --(stopwatch_stop>'d0)--> 2 2 --(stopwatch_init>'d0)--> 0 2 --((!(stopwatch_init>'d0))&&(stopwatch_start>'d0))--> 1 Loop (0, 1, 2) (1, 2) (a) Command Line Output (b) Graphical Output 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 Condition’s Min/Max Values Target’s Assigned Value AND Condition Target Signal
  56. 56. PythonでVerilog HDLのコード生成 1 import pyverilog.vparser.ast as vast 2 from pyverilog.ast_code_generator.codegen import ASTCodeGenerator 3 4 params = vast.Paramlist(()) 5 clk = vast.Ioport( vast.Input(’CLK’) ) 6 rst = vast.Ioport( vast.Input(’RST’) ) 7 width = vast.Width( vast.IntConst(’7’), vast.IntConst(’0’) ) 8 led = vast.Ioport( vast.Output(’led’, width=width) ) 9 ports = vast.Portlist( (clk, rst, led) ) 10 items = ( vast.Assign( vast.Identifier(’led’), vast.IntConst(’8’) ) ,) 11 ast = vast.ModuleDef("top", params, ports, items) 12 13 codegen = ASTCodeGenerator() 14 rslt = codegen.visit(ast) 15 print(rslt) 11 19, 14 13:53 codegen.py 1 module top 2 ( 3 input [0:0] CLK, 4 input [0:0] RST, 5 output [7:0] led 6 ); 7 assign led = 8; 8 endmodule 11 19, 14 14:15 generated.v Python Verilog HDL Execute これをベースに 抽象度の高いHDLを作りたい PyCon JP 2015 Shinya T-Y, NAIST 56 Veriloggen
  57. 57. Veriloggen PyCon JP 2015 Shinya T-Y, NAIST 57 実行 Verilog HDLPython PythonでVerilog HDLを 組み立てるライブラリ n  Pythonで書いた動作を HDLに変換する 高位合成ではない n  Pythonのオブジェクト としてVerilogの信号や 代入を組み上げていく n  当該オブジェクトの to_verilog() を呼ぶと Verilogのソースコード のテキストに変換
  58. 58. 例)たくさんLEDを追加してみる PyCon JP 2015 Shinya T-Y, NAIST 58 実行
  59. 59. Veriloggenで何ができるか? n  Verilog HDLのメタプログラミングができる l  例)回路生成するレシピをPython+Veriloggenで定義して アプリケーション規模に応じて回路を自動生成 •  Verilog HDLにはgenerate構文があるか機能は限定的 n  独自の高位合成コンパイラのバックエンドとして使える l  (PyCoRAMではない)Pythonベースの高位合成ツールとか? l  Post PyCoRAMを現在開発中・・・こうご期待 •  制御とパイプラインを柔軟に結合する仕組み •  既存のVerilog HDL資源を再利用する仕組み PyCon JP 2015 Shinya T-Y, NAIST 59
  60. 60. 今後の高位合成ツールは どうあるべきか? PyCon JP 2015 Shinya T-Y, NAIST 60
  61. 61. 私が思う今後の高位合成の要件(まじめな話) n  オープンソースである l  普段よく使うコンパイラの多くはオープンソース l  誰でもすぐ導入できるのは正義 •  今はFPGAの評価ボードも安価である n  ソフトウェア開発者が自然に導入できる l  記述モデル:結局、手続き型+オブジェクト指向がよい? •  慣れ親しんだプログラミングモデル=手になじんでいる l  多少のディレクティブは許容される •  GPUではCUDAが当たり前 •  FPGAでもOpenACC,OpenMPやMPI程度なら許されるか? PyCon JP 2015 Shinya T-Y, NAIST 61
  62. 62. 私が思う今後の高位合成の要件(まじめな話) n  高位合成系におけるLLVM的環境 l  データフローを入力したらスケジューリング・アロケーション してくれるフレームワーク・足回り •  LLVM: LLVM-IRを入力に最適化したり機械語を吐いたり •  DFGレベルのスケジューリング・最適化をやってくれる l  言語や記述モデルでオリジナリティを出す •  粗粒度・スレッドレベルなスケジューリングは自分で PyCon JP 2015 Shinya T-Y, NAIST 62
  63. 63. 私が思う今後の高位合成の要件(気楽な話) n  好きな言語でハードウェア開発できる l  ソフトウェア開発は用途と好みに応じて言語を選べる •  C, C++, C#, Java, Python, Ruby, Perl, JavaScrit, Scala, Go, Haskell l  ハードウェア開発は?→選択肢が少ない •  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で書きたい!よね? PyCon JP 2015 Shinya T-Y, NAIST 63
  64. 64. まとめ n  FPGA・高位合成の基礎と Pythonによる高位設計フレームワークについて l  「こんな風に設計できたらいいな」を実現しよう n  各種ツールはGitHubで公開中 l  PyCoRAM: https://github.com/PyHDI/PyCoRAM l  Pyverilog: https://github.com/PyHDI/Pyverilog l  Veriloggen: https://github.com/PyHDI/veriloggen PyCon JP 2015 Shinya T-Y, NAIST 64
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×