SlideShare a Scribd company logo
Polyphony の行く末
(有)シンビー
鈴木[量]
2018/3/3
自己紹介
著者です
最初に購入したコンピュータはHP-41C(関数電卓)。生涯一プログラマを目指す。
扱ってきたCPUは Z80, 6502, 6809, 680XX, 80x86, V30, i860, Sparc, MIPS, PicoJava,
M16C, M32C, H8, ARM, PowerPC, SH4, NiosII, MicroBlaze, V850 など多数。
扱ってきた言語は BASIC, Common Lisp, FORTH, Pascal, FORTRAN, C, C++, Smalltalk,
Objective-C, HyperTalk, Perl, Java, JavaScript, SQL, Scheme, VHDL, Verilog, C#, Lua,
Ocaml, Tcl, Python など多数。手がけたプロジェクトも Unix移植、RTOS移植、スパコ
ンのネットワーク設計、Windows ドライバ開発、 FPGA を含むハードウェア、ボード
設計、GPGPUによる画像処理、コンパイラ、ウェブ系、IoTと広範囲に及ぶ。CQ 出版
での記事の執筆は 2000 年からと足掛け 19 年となった。RTOS 開発現場の経験を
活かし近年ではコンサルタント業もこなす。
2
技術的なバックボーン
• IP Core
– HD-SDIの画像処理システム
– ステレオ
– スケーラ
• Unix
– SystemV
– Sun (64bit)
• stream ドライバ
– FreeBSD
– X-window
– Linux プラットフォーム開発
• Yocto
• Xen for ARM
TLMu
• Windows
– NT 以降のデバイスドライバ
– Com
– C#/WPF
• iTRON
– T-Kernel
– Toppers
– SafeG(Trust Zone)
• SDSoC
– プラットフォーム開発
– アルゴリズム検証
• コンパイラ
– Lisp (Scheme) によるコンパイラ
– Python → Verilog (Polyphony)
• ASIC/ボード設計
– Make LSI
– Kiss4(Zynq 小型ボード)
3
関連記事
• インタフェース2018年1 月号
– 第2章 Pythonからも使える 200ドルFPGA制御ボード入門
– 第3章 Arduino/Pmodでつなげば試せる
– リアルタイムPython③...I/O制御あれこれ
– 第4章 ソフト屋さんでも小規模FPGAの設計でも使えそう
– PythonでFPGAを作る
Python
Lattice
4
アジェンダ
• 高位合成ってなんでしょう?
• Polyphony が提供するもの
• 応用例
– SPI
– UART
– AXI Lite (Master)
– I2C
– アプリケーション
• SHA256
• xmodem
• Polyphony 新機能
• Polyphony の今後
5
高位合成ってんなんでしょう?
What Is This Thing Called HLS.
6
高位合成(High-level Synthesis)
って何でしょう?
• 抽象度の高い言語で合成可能な論理回路を
生成する(ターゲットは主に FPGA)
C/C++
Python
Java
Ruby
独自言語
• VHDL
• Verilog-HDL
7
高位合成友の会
• FPGA ベンダ
– Vivado HLS/SDSoC
– Intel HLS コンパイラ
• 高位合成の友の会
– Polyphony
– Veriloggen
– Neon Light + IROHA
– Synthesijer
– Sigboost
– Synverll
Python の高位合成
Python の高位合成
独自言語の高位合成
Javaの高位合成
プロの音楽家用の高位合成
LLVMを使った高位合成
8
C/C++
Python
Java
Ruby
独自言語
コンパイラって何でしょう?
プログラミング言語
AST
構文木 RTL(FPGA)
実行可能なコード
アセンブラ
(CPU)
バイトコード
(VM)
IR
中間言語
9
もうちょい簡単に考えよう
エクセル
XML JSON
独自データ
簡単データ
オレオレ変換 Python
なんかコード
Java Script
C
オレオレ変換でも
広い意味でコンパイラだ!!(と言い切る)
10
コンパイラを作ろう!!
• Python の AST は比較的簡単なうえに本格的
• XML とか JSON とかカンマ区切り(CSV) とか
簡単なところからスタートでもよさそう
Scheme とか ML とか OCaml とかは横に置いておこう
チャレンジするプログラマの成功譚、失敗談
ゆるぼ
11
組み込みシステムでコンパイラ
argc, argv による簡単シェル
• 最初はいいけど
いずれ変数を導入して
破綻する
コンパイラと shell
12
• 最初は難しいけど
変数とか関数とか追加可能
Polyphony が提供するもの
The Hitchhiker's Guide to Polyphony.
13
Polyphonyはこんなツール
特徴
● Pythonで書いたコードをHDL(Verilog)に
変換するためのコンパイラ
● オープンソース
得意なこと
● 動くものを早く作る
苦手なこと
● クロックレベルの記述(<=今後の改善点)
14
Polyphonyの使い方
15
Polyphonyの紹介:
Q: 言語として Python のすべてをカバーしていますか?
A: いいえ、Python のサブセットになります。
Python
Polyphony
(is a subset of Python)
Function
Class
List(Fixed size)
Tuple
For/While
If/Else
...
String
Dictionary
Set
Builtin funcs
...
Python のすべてをカバーしているわけではない
16
Python の関数を Verilog にする
from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()
フィボナッチ数列
module fib
(
input wire clk,
input wire rst,
input wire fib_ready,
input wire fib_accept,
output reg fib_valid,
input wire signed [31:0] fib_in_n,
output reg signed [31:0] fib_out_0
);
中略
//signals:
wire cond565;
wire cond566;
中略
always @(posedge clk) begin
if (rst) begin
fib_out_0 <= 0;
i2 <= 0;
n <= 0;
r02 <= 0;
r12 <= 0;
fib_state <= fib_b1_INIT;
end else begin //if (rst)
中略
endcase
end
end
endmodule
17
Python の関数
テスト
Verilog HDL
どの辺が HDL 記述と違うか?
Polyphony (Python) Verilog-HDL
def a_b():
a = 3
b = 4
c = a + b
print(c)
出力結果は 7
a = 3;
b = 4;
c <= a + b;
$display("%d", c);
出力結果は x(不定)
18
どの辺が MyHDL 記述と違うか?
Polyphony (Python) MyHDL
def a_b():
a = 3
b = 4
c = a + b
print(c)
出力結果は 7
def a_b(clock, start, done, reset):
a = Signal(intbv(0)[7:])
b = Signal(intbv(0)[7:])
c = Signal(intbv(0)[7:])
@always_seq(clock.posedge, reset=reset)
def logic():
if reset:
a.next = 3
b.next = 4
else:
while True:
if start:
c.next = a + b
done.next = True
return logic
出力結果は7?
19
nextという
特別な
キーワード
Polyphony の特徴
Polyphony (Python)
def a_b():
a = 3
b = 4
c = a + b
print(c)
出力結果は 7
a = 3 b = 4
c = a + b
自動でスケジューリングしてくれる
タンカン
なのよ20
それって、HDL 的においしいの?
• おいしさとは?
– 性能がよい
– 利便性がよい
21
ハードウェア記述言語の生産性と性能
生
産
性
性能
(速度,リソース...)
高
低
高位合成処理系
VHDL
Verilog
良い悪い
Polyphonoy
(目標)
夢の
処理
系
いまここ! →
22
ハードウェア記述言語の生産性と性能
生
産
性
性能
(速度,リソース...)
高
低
高位合成処理系
VHDL
Verilog
良い悪い
Polyphonoy
(目標)
夢の
処理
系
・言語機能の充実
・コードの再利用
・最適化性能アップ
・バックエンドライブラリの充実
23
参考資料
• Polyphony ~Pythonベースの高位合成コンパイラ~ (2015 高位合成友の
会)
https://www.slideshare.net/ktok07b6/3-polyphony
• Github
https://github.com/ktok07b6/polyphony
• プログラミング言語PythonではじめるFPGA開発入門(FPGA マガジン No.12)
http://www.kumikomi.net/fpga/contents/su012.php
• A Python-Based High-Level Synthesis Compiler (2017 OpenSuco フランクフルトでの発表)
http://www.opensuco.community/wp-content/uploads/2017/06/ISC2017-
Kataoka.pdf
• Polyphony ではじめる FPGA(PyCon 2017 で発表)
https://www.slideshare.net/ryos36/polyphony-python-fpga
• Python で FPGA プログラミング (PYNQ 祭り 2017)
ikwzm の発表(ありがとうございます)
https://www.slideshare.net/ssuser941451/pynq-72804195
24
応用例
Sax-A-Go-Go
25
これらをサポート
出来るようになりました。
• SPI
• UART
• AXI4 Lite (Master)
• I2C
• アプリケーション
– SHA256
– xmodem
26
SPI
秋月の
3軸加速度センサー
27
コード例
self.write_data(0x20, 0x7F)
data_who_am_i = self.read_data(0x0F)
data_x_l = self.read_data(0x29)
data_y_l = self.read_data(0x2B)
data_z_l = self.read_data(0x2D)
28
初期化
処理
XYZ の加速度センサの
値を取得
UART
Verilog Python
29
コード例
def print_hex(self, addr:bit16, data:bit8):
write_hex16(self.debug_print_q, addr >> 8)
write_hex16(self.debug_print_q, addr & 0xFF)
self.debug_print_q(0x20)
write_hex16(self.debug_print_q, data)
write_ln(self.debug_print_q)
文字表示との相性は悪い
30
ラズパイカメラ I2C の結果出力例
31
AXI Lite (Master)
Python
32
コード例
self.write_reg(base_addr | 0x08, 0x028c0166)
self.write_reg(base_addr | 0x10, 0x02000000)
self.write_reg(base_addr | 0x14, 0x02400000)
self.write_reg(base_addr | 0x18, 0x000032A0)
self.write_reg(base_addr | 0x08, 0x81220fff)
33
I2C
Python
ラズパイカメラ
34
コード例
from imx219_init_data import
INIT_DATA_MODE1, INIT_DATA_MODE7
def init_code(self):
init_data = INIT_DATA_MODE7
for i in range(0, len(init_data), 2):
addr:bit16 = init_data[i + 0]
data:bit8 = init_data[i + 1]
self.write_reg(addr, data)
self.print_hex(addr, data)
INIT_DATA_MODE7 = [
0x0100, 0x00,
0x30eb, 0x05,
0x30eb, 0x0c,
0x300a, 0xff,
0x300b, 0xff,
0x30eb, 0x05,
….
後略
35
Polyphony 新機能
What Game Shall We Play Today.
36
Polyphony のおいしさ
• 利便性の向上
• 性能への挑戦
37
tuple(1/2)
38
def tuple02(x, y, z):
ts = (x, y, z)*3
s = 0
for t in ts:
s += t
return s
tuple
構造体みたいなもの
def receive_block0(block):
if block == 0:
return (True, 0)
elif block == 1:
return (True, EOT)
elif block == 2:
return (False, 0)
else:
return (False, EOT)
tuple(2/2)
39
tuple
構造体みたいなもの
import文対応
Pythonのimport文に対応
既存のソースを再利用することが可能
●import *
●import * as *
●from * import *
●from * import * as *
等の構文に対応
for の展開(unroll)
41
def unroll16(start, stop):
sum = 0
for i in unroll(range(4)):
sum += i
for i in range(10):
sum += i
return sum
unroll
pipeline のサポート
42
def pipelined_unroll01(xs, ys):
s = 0
for i in pipelined(unroll(range(8), 2)):
x = xs[i] + 1
if x < 0:
s = s + x
else:
s = s - x
ys[i] = x
#print(x)
return s
unroll
pipelined
Polyphony の今後
Inherit the Stars
43
目指すところは?
• Python でパタヘネが出来るようにしたい
44
コンピュータの構成と設計(1994年版) から抜粋
やるべきことリスト
• II=2 以上のパイプライン
• 同時性の記述
• Verilog 入出力
Python の
Verilog Parser
はできた
45
高位合成共通の課題(コミュ力重要)
• インタフェース
– 同時性の記述
– クロック単位の動作の保証
• ビット幅の柔軟性
def a_b():
a = 3
b = 4
c = a + b
print(c)
直感的にわかりやすい
記述(時間の概念がない)
抽象的な int 表現
46
妄想
47
def __init__(self, uart_class):
obj = uart_class(19200)
...
~
Class を引き
渡せると楽
しくなりそう
妄想
• AXIS への対応
48
Polyphony のモジュール
を挿入!!
これからも Polyphony をよろしく!!
ご清聴ありがとうございました
49
https://github.com/ktok07b6/polyphony
うけませんでした。こういうことはやってはいけないみたいよ。
micro:bit
One more thing
50
無駄遣い micro:bit
イギリスのBBCが主体となって作った教育向けのマイコンボードです。英国では
11歳〜12歳の子供全員に無償で配布されており、授業の中で活用が進んでい
ます。 (スイッチサイエンスのウェブサイトから)
51
https://makecode.microbit.org/
ツールのインストールの必要性
がない 52
ウェブ上にシミュレータ
53
完成プログラムはダウンロード
54
書き込みは USB 経由
55
実行!!
Aボタンで A を表示 Bボタンで B を表示 揺らすと X を表示
(加速度センサ)
56
参考:Blockly
Python をサポート
micro:bit とは直接関係ないが、google も blockly という block editor を
開発している。今後はやるのか?
57
ということでサーバ作ってみた
58
Python コード出来た
59
Verilog-HDL もできた!?
60
自動生成だから最早なんだかわからない。
ではあるが、出来てそうだぞ。
と日記には書いておこう
Polyphony サーバ!乞うご期待!
61
これからも Polyphony をよろしく!!
ご清聴ありがとうございました
62

More Related Content

PDF
カスタムメモリマネージャと高速なメモリアロケータについて
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PDF
猫でも分かる UE4の新しいサンプル「Action RPG」について
PDF
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
ODP
Unity ネイティブプラグインの作成について
PPTX
C#や.NET Frameworkがやっていること
カスタムメモリマネージャと高速なメモリアロケータについて
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
猫でも分かる UE4の新しいサンプル「Action RPG」について
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
Unity ネイティブプラグインの作成について
C#や.NET Frameworkがやっていること

What's hot (20)

PDF
Yoctoで綺麗なkernel configを作る
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
PDF
UE4でマルチプレイヤーゲームを作ろう
PDF
DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ
PDF
UE4とUnrealC++について
PPTX
Polyphony: Python ではじめる FPGA
PDF
IL2CPPに関する軽い話
PDF
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
PDF
ゲームサーバ開発現場の考え方
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
PDF
ゲーム開発者のための C++11/C++14
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
PDF
多機能ボイチャを簡単に導入する方法
PPTX
UE4のためのより良いゲーム設計を理解しよう!
PDF
【Unity】Scriptable object 入門と活用例
PPTX
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
PPTX
大規模ゲーム開発における build 高速化と安定化
PPTX
猫でも分かる UE4のAnimation Blueprintの運用について
Yoctoで綺麗なkernel configを作る
プログラムを高速化する話Ⅱ 〜GPGPU編〜
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
UE4でマルチプレイヤーゲームを作ろう
DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ
UE4とUnrealC++について
Polyphony: Python ではじめる FPGA
IL2CPPに関する軽い話
UE4ディープラーニングってやつでなんとかして!環境構築編(Python3+TensorFlow)
ゲームサーバ開発現場の考え方
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
ゲーム開発者のための C++11/C++14
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
多機能ボイチャを簡単に導入する方法
UE4のためのより良いゲーム設計を理解しよう!
【Unity】Scriptable object 入門と活用例
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
大規模ゲーム開発における build 高速化と安定化
猫でも分かる UE4のAnimation Blueprintの運用について
Ad

Similar to Polyphony の行く末(2018/3/3) (20)

KEY
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
PDF
Python physicalcomputing
PPTX
自作LSIコミュニティの可能性
PPTX
Prosym2012
PDF
StackExchangeで見たシステムプログラミング案件
PDF
Zynq VIPを利用したテストベンチ
PDF
HaskellではじめるCortex-M3組込みプログラミング
PDF
Windowsのパケットモニタ作成
PDF
llvm入門
PPTX
[CEDEC2017] LINEゲームのセキュリティ診断手法
PPTX
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
PDF
Exploring the x64
KEY
関東GPGPU勉強会 LLVM meets GPU
PDF
Boost Tour 1.50.0 All
PDF
riscv instruction sets lets-impl-rv32i.pdf
PPTX
Interrupts on xv6
PPTX
ソフトウェア志向の組込みシステム協調設計環境
ODP
Introduction of Python
PPTX
ぱっと見でわかるC++11
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
Python physicalcomputing
自作LSIコミュニティの可能性
Prosym2012
StackExchangeで見たシステムプログラミング案件
Zynq VIPを利用したテストベンチ
HaskellではじめるCortex-M3組込みプログラミング
Windowsのパケットモニタ作成
llvm入門
[CEDEC2017] LINEゲームのセキュリティ診断手法
[CB16] (P)FACE :アップルのコアへ、そしてルート権限へのエクスプロイト by Moony Li & Jack Tang
Exploring the x64
関東GPGPU勉強会 LLVM meets GPU
Boost Tour 1.50.0 All
riscv instruction sets lets-impl-rv32i.pdf
Interrupts on xv6
ソフトウェア志向の組込みシステム協調設計環境
Introduction of Python
ぱっと見でわかるC++11
Ad

More from ryos36 (19)

PPTX
Pycairo を使ってみる その1
PPTX
ストーリーとは
PPTX
CNN でテニス選手の動きを解析する
PPTX
Polyphony の並列化
PPTX
Polyphony 新機能ツアー
PPTX
Stellaris を使った組み込みアプリ開発ガイド
PPTX
研究者のための Python による FPGA 入門
PPTX
数値計算のための Python + FPGA
PPTX
Polyphony IO まとめ
PPTX
PYNQ 祭り: Pmod のプログラミング
PPTX
SDSoC でストリーム
PPTX
Analog Devices の IP コアを使う
PPTX
SDSoC と Vivado
PPTX
高速化のポイント
PPTX
20周遅れ
PPTX
90分 Scheme to C(勝手に抄訳版)
PPTX
並列計算への道 2015年版
PDF
NiosII と RTOS について
PPTX
Synthesijer で作るFORTH仮想マシン
Pycairo を使ってみる その1
ストーリーとは
CNN でテニス選手の動きを解析する
Polyphony の並列化
Polyphony 新機能ツアー
Stellaris を使った組み込みアプリ開発ガイド
研究者のための Python による FPGA 入門
数値計算のための Python + FPGA
Polyphony IO まとめ
PYNQ 祭り: Pmod のプログラミング
SDSoC でストリーム
Analog Devices の IP コアを使う
SDSoC と Vivado
高速化のポイント
20周遅れ
90分 Scheme to C(勝手に抄訳版)
並列計算への道 2015年版
NiosII と RTOS について
Synthesijer で作るFORTH仮想マシン

Polyphony の行く末(2018/3/3)

Editor's Notes

  • #3: 今日は Polyphony の行方というお題で30分話します。 最初に、自分の技術的なバックボーンを話します。 最初に購入したコンピュータは HP-41C という関数電卓、、、、で PC-9801 の初代を、、、 という話をすると2時間くらいかかるのでここははしょります。 恐らく、コンピュータと名のつくかなり広い分野にわたって関わっています。
  • #4: 特筆すべきことはありませんが、いわゆる組み込みシステムから、Windows から、Unix、までいろいろ経験しています。 最近では ASIC を作ることにも参加させていただきました。
  • #5: 一番最近の執筆は 2018 年の1月号の Ptyhon で FPGA を制御しようという記事です。 今日の内容とかぶる点も多いので、興味のある方は、ぜひ、ご購入ください。 この号は、中原先生がギネスについても書かれている号でもあります。。
  • #6: では今日のアジェンダです。 先頭バッターなので高位合成についても少しお話します。 その後、本題である Python による 高位合成のコンパイラである Polyphony の紹介と応用例について 最後に Polyphony の新機能と今後について お話しします。 アプリよりの話になっているのでコンパイラという意味ではちょっと物足りないかもしれません。 コンパイラ内部の技術的な資料はまた別途資料をあげますので参照してもらえればと思います。
  • #7: まずは高位合成って何という話からです。
  • #8: 簡単にいうと、プログラミング言語をコンパイルして FPGA などで動かす技術です。
  • #9: 高位合成友の会も第5回となりました。 友の会は、高位合成に関連する話題としてコンパイラなどの事を情報交換しましょうという 趣旨でゆる~~く存在している会です。 今回は新しい取り組みの話もありそうなので、いろんな人が、特にソフトウェアよりの人が 高位合成はよくわからないけどこんなのつくったとか、 FPGA でこんなの出来たとか、そういった話題が これもゆる~~~く、集まればと期待しています。
  • #10: で、そのコンパイラって何でしょうという話になりますが、 プログラミング言語を解析して構文木、AST と呼ばれたりしますが それを中間言語になおして、最後は、実行可能なコードにするというのが 大きな流れかと思います。 このとき、AST や IR という聞きなれないかもしれない略語をつかっちゃうので 敷居が高くなってしまうのですが、正直、この辺はもっと、 ゆる~~~い感じでとらえてもらえればと思います。
  • #11: データを、おれおれ変換で C やら Python やら Java Script に 落とせれば、まぁ、広い意味でコンパイラだと言い切りましょう。 実際、最近の AI 界隈では、この手のをコンパイラだと言い切ってしまっているように見受けられます。 まぁ、それで、とりあえずは、いいんだと思います。
  • #12: ということで、みなさんも機会があればコンパイラを作ってみてください。 コンパイラと言い切るのに抵抗があるなら データコンバータでもいいと思います。
  • #13: 高位合成ではないのですが、 特に組み込みシステムでは是非コンパイラを作ってみてください。
  • #14: それでは本題の Python で高位合成をするコンパイラの Polyphony について話します。
  • #15: Polyphony がどんなツールなのかをかいつまんでまとめると Python で書いたコードを HDL に変換するコンパイラ 動くものを早く作る 性能には“現在のところ”重きを置いていない というツールになります。 Python でというのがポイントになります。
  • #16: 使い方としては 「Python によるコードの記述」をし ここが重要なのですが「Python によるコードの実行」によりデバッグをしておきます そして、「Polyphony によりコンパイル」をします。 そうすると、Verilog という FPGA などで動く言語にコンパイルされるので それをまずは Windows などでソフト的にシミュレーションします。 うまく動いたら、実際の FPGA のボードで 「実行」します。
  • #17: そして、 Python のコードをコンパイルすると言ってもすべてのコードをコンパイルできるわけではなく、 とうぜん、print などの文字列などはサポートされておらず、Python のサブセットになっています。
  • #18: コンパイルというものがどんな感じなるのかをイメージしてもらうために 例をあげます。 ここでは Python の関数が verilog のモジュールにコンパイルされる例です。
  • #19: Python と Verilog-HDL を比較するというのも変なのですが、 なぜ高位合成が必要かというのを説明するためにちょっと比較します。 例えば a, b という変数に 3, 4 をいれて足して c という変数に代入するを考えます。 左が python で書かれたもので右が Verilog で書かれたものです。 大ざっぱに書いているので、そうじゃないだろというコメントもあるかと思いますが、 ここはその結果を単純に考えます。 Python で普通にソフトで実行すれば、左は 3+4 で 7になりますが、 ハードウェアの世界では3+4 は時間的な要素が入ってくるのでかならずしも、 その瞬間には 7 になりません。 もちろん最終的には計算なので 7 になるわけですが、時間的要素が入ってくるので ある一瞬ではハードウェアでは出力結果が不定ということがあり得るのです。
  • #20: Python のアプリ?で MyHDL という有名なものがあるのですが、 これも Python でハードウェアの記述が出来ます。 これをちょっと見てもらえると、わかるのですが、next という特別なキーワードを使って 時間的な記述をしています。 実はこの PPT 作成のために少し MyHDL をやってみたのですが、 難しすぎてできませんでした。 なので、このプログラムがただしいかどうかはちょっと怪しいところがあります。 印象としては SystemC ライクといえばわかる人がいるかもしれません。 これなら、私の場合 VHDL で書いた方がわかりやすく書けると思いました。
  • #21: その点、Polyphony であれば、Python がわかればハードウェアの世界に入っていけるので 敷居は非常に低いと思います。 時間的な考慮はプログラマはしなくてもいいようになっています。 コンパイラが自動的にスケジュールリングしてくれます。
  • #22: では、実際に Python で高位合成をしてどんなメリットがあるのですか?というところですが、 これは実際に後で使い方を見ていきたいと思います。
  • #23: 高位合成を使いやすさと性能で考えると、Polyphony は ここ数年の間、改善され、生産性の高い、立派に高位合成と言ってよいところまできました。 そして、現在は目標も性能を上げる方にシフトしています。
  • #24: 今後はライブラリなどを増やして、並列計算をとりわけパイプライン処理を考える際の 便利なツールになるように開発しています。
  • #26: それでは応用例を見ていきます。
  • #27: インタフェースの 2018 年1月号にも書いたものにプラスアルファして AXI lite や i2c ができるようになりました。
  • #28: まずは SPI ですが、雑誌に書いたように秋月の3軸加速度センサーを直接制御できます。 この図では Arty Z7 になっていますが、Lattice でも Cyclone V でも確認しています。
  • #29: で、コード例ですが、これは高位合成ならではで関数表現になって 分かりやすくなっていると思います。 もちろん Verilog や VHDL でも工夫すれば、関数表現は出来るのですが、 どうやっても開発時にステートマシーンを考えなくてはならなくなると思います。
  • #30: これは UART の例です。UART は一部、RTL で時間の制御をしています。 ボーレートとかの部分ですね。 これも Polyphony で書いてもよかったのですが、この手の Verilog はいろんなところに転がっているので そのままつかっちゃいます。
  • #31: これはその応用例で print_hex という形である 16bit と 8 bit のデータを UART に出しています。 現時点で文字列を直接扱えるわけではないので 非常にわかりづらいコードではあります。 でも、デバッグ時に UART に情報が出てくるのは心強いことです。
  • #32: これはラズパイカメラをデバッグしていた時の例ですが こんな感じで表示してくれるので、数字だけでも、デバッグに大変役に立ちます。
  • #33: これは AXI Lite の master の例です。
  • #34: コード例は、組み込みでよくみるような、レジスタのアドレスと書き込みデータの羅列になっています。 AXI lite の Master の記述が出来るので、極端な話、CPU なしで動作可能なシステムが作れてしまいます。 ツールにもよるのですが、ハードとソフトの IDE を行ったり来たりする必要がなくなります。
  • #35: これが I2C でラズパイカメラをアクセスしたときの回路とその様子です。 実際には iobuf が必要だったのでそこは verilog で外付けです。 この verilog の記述は FPGA の部屋を参考しました。 いつも参照させていただいています。どうもありがとうございます。
  • #36: コードの例ですが、Python で初期化の関数を書いて、 あとは配列、正確には Python ではリストですが、 それを読み込んで順次初期化します。 ここでは mode7 の初期化していますが、これは、配列を差し替えれば、別のモードの初期化が出来ます。 ちょっとだけ付け加えると、現時点では配列は HDL に埋め込みなので、毎回、合成をする必要があります。 将来的には合成無しでブロックラムのデータ入れ替えだけで出来るようにしたいとは思っています。
  • #38: さて、Polyphony の利点について再度、2つの視点から見てみます。 今回は応用例を通して、1の利便性についての述べてきました。 今後は FPGA の性能を出し切るという方向になると思います。 つまり、今後は性能への挑戦をしていきます。 それを踏まえたうえで、幾つか機能を紹介しつたいとおもいます。
  • #39: Tuple という構造体みたいなものを
  • #40: こんな感じで2つの値を返すことが出来ます。ハードウェアの記述に有効そうな予感のする文法です。
  • #41: 以前にも報告しましたが、import 文に部分対応しました。 ディレクトリはまだ読めてませんが、これで既存の再利用が出来るようになりました。
  • #42: Unroll も出来るようになりました。これは性能向上に一役買うと思います。
  • #43: Pipeline もサポートしました。Unroll しながらの複合的な pipeline も可能です。
  • #45: パタヘネを実現するとなると重要なのがキャッシュとパイプラインになります。なかなか難しいのですが、チャレンジしていきたいと思っています。
  • #46: 今後性能向上を目指していくうえで、II=2 以上のパイプラインであったり、 同時性の記述方法であったり、 Verilog との連携をするようにしていきます。 Verilog の 簡単Parser はすでにできています。
  • #47: 最後に高位合成の共通課題をあげておきます。 一つはインタフェースです。 Verilog で記述したプロトコルはクロック単位の動作が記述できます。 それに対応しようと思うと同時性の記述であったり、クロック単位の動作の保証が必要です。 しかし、それは直感的にわかりやすい記述と相反します。 またビットの柔軟性を考えたとき、ビットというハードウェア的な考えと int などの抽象的な型は相反します。 Python3 では特に数字が 32bit や 64bit であるという区切りではなく抽象度が上がっているため それとの整合性を保つのが難しい問題です。
  • #48: 最後にちょっとした妄想を書いておきます。コンストラクタに class を引き渡せると、 汎用性がぐっと上がって楽しくなりそうです。 内部的には Lambda は達成しているので可能だと思っています。
  • #49: AXI Stream への対応はしたいと思っています。 これを達成して、 FPGA の帯域を使い切るといったことが容易にできるようにと思っています。
  • #50: それでは本日の発表を終わりにします。 Polyphony を今後ともよろしくお願いします。