Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

294 views

Published on

高位合成友の会での発表。高位合成とはなんでしょう?にはじまって、Python での高位合成の話と、その応用について。

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Polyphony の行く末 (有)シンビー 鈴木[量] 2018/3/3
  2. 2. 自己紹介 著者です 最初に購入したコンピュータは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
  3. 3. 技術的なバックボーン • 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
  4. 4. 関連記事 • インタフェース2018年1 月号 – 第2章 Pythonからも使える 200ドルFPGA制御ボード入門 – 第3章 Arduino/Pmodでつなげば試せる – リアルタイムPython③...I/O制御あれこれ – 第4章 ソフト屋さんでも小規模FPGAの設計でも使えそう – PythonでFPGAを作る Python Lattice 4
  5. 5. アジェンダ • 高位合成ってなんでしょう? • Polyphony が提供するもの • 応用例 – SPI – UART – AXI Lite (Master) – I2C – アプリケーション • SHA256 • xmodem • Polyphony 新機能 • Polyphony の今後 5
  6. 6. 高位合成ってんなんでしょう? What Is This Thing Called HLS. 6
  7. 7. 高位合成(High-level Synthesis) って何でしょう? • 抽象度の高い言語で合成可能な論理回路を 生成する(ターゲットは主に FPGA) C/C++ Python Java Ruby 独自言語 • VHDL • Verilog-HDL 7
  8. 8. 高位合成友の会 • FPGA ベンダ – Vivado HLS/SDSoC – Intel HLS コンパイラ • 高位合成の友の会 – Polyphony – Veriloggen – Neon Light + IROHA – Synthesijer – Sigboost – Synverll Python の高位合成 Python の高位合成 独自言語の高位合成 Javaの高位合成 プロの音楽家用の高位合成 LLVMを使った高位合成 8
  9. 9. C/C++ Python Java Ruby 独自言語 コンパイラって何でしょう? プログラミング言語 AST 構文木 RTL(FPGA) 実行可能なコード アセンブラ (CPU) バイトコード (VM) IR 中間言語 9
  10. 10. もうちょい簡単に考えよう エクセル XML JSON 独自データ 簡単データ オレオレ変換 Python なんかコード Java Script C オレオレ変換でも 広い意味でコンパイラだ!!(と言い切る) 10
  11. 11. コンパイラを作ろう!! • Python の AST は比較的簡単なうえに本格的 • XML とか JSON とかカンマ区切り(CSV) とか 簡単なところからスタートでもよさそう Scheme とか ML とか OCaml とかは横に置いておこう チャレンジするプログラマの成功譚、失敗談 ゆるぼ 11
  12. 12. 組み込みシステムでコンパイラ argc, argv による簡単シェル • 最初はいいけど いずれ変数を導入して 破綻する コンパイラと shell 12 • 最初は難しいけど 変数とか関数とか追加可能
  13. 13. Polyphony が提供するもの The Hitchhiker's Guide to Polyphony. 13
  14. 14. Polyphonyはこんなツール 特徴 ● Pythonで書いたコードをHDL(Verilog)に 変換するためのコンパイラ ● オープンソース 得意なこと ● 動くものを早く作る 苦手なこと ● クロックレベルの記述(<=今後の改善点) 14
  15. 15. Polyphonyの使い方 15
  16. 16. 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
  17. 17. 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
  18. 18. どの辺が 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
  19. 19. どの辺が 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という 特別な キーワード
  20. 20. Polyphony の特徴 Polyphony (Python) def a_b(): a = 3 b = 4 c = a + b print(c) 出力結果は 7 a = 3 b = 4 c = a + b 自動でスケジューリングしてくれる タンカン なのよ20
  21. 21. それって、HDL 的においしいの? • おいしさとは? – 性能がよい – 利便性がよい 21
  22. 22. ハードウェア記述言語の生産性と性能 生 産 性 性能 (速度,リソース...) 高 低 高位合成処理系 VHDL Verilog 良い悪い Polyphonoy (目標) 夢の 処理 系 いまここ! → 22
  23. 23. ハードウェア記述言語の生産性と性能 生 産 性 性能 (速度,リソース...) 高 低 高位合成処理系 VHDL Verilog 良い悪い Polyphonoy (目標) 夢の 処理 系 ・言語機能の充実 ・コードの再利用 ・最適化性能アップ ・バックエンドライブラリの充実 23
  24. 24. 参考資料 • 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
  25. 25. 応用例 Sax-A-Go-Go 25
  26. 26. これらをサポート 出来るようになりました。 • SPI • UART • AXI4 Lite (Master) • I2C • アプリケーション – SHA256 – xmodem 26
  27. 27. SPI 秋月の 3軸加速度センサー 27
  28. 28. コード例 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 の加速度センサの 値を取得
  29. 29. UART Verilog Python 29
  30. 30. コード例 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
  31. 31. ラズパイカメラ I2C の結果出力例 31
  32. 32. AXI Lite (Master) Python 32
  33. 33. コード例 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
  34. 34. I2C Python ラズパイカメラ 34
  35. 35. コード例 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
  36. 36. Polyphony 新機能 What Game Shall We Play Today. 36
  37. 37. Polyphony のおいしさ • 利便性の向上 • 性能への挑戦 37
  38. 38. 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 構造体みたいなもの
  39. 39. 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 構造体みたいなもの
  40. 40. import文対応 Pythonのimport文に対応 既存のソースを再利用することが可能 ●import * ●import * as * ●from * import * ●from * import * as * 等の構文に対応
  41. 41. 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
  42. 42. 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
  43. 43. Polyphony の今後 Inherit the Stars 43
  44. 44. 目指すところは? • Python でパタヘネが出来るようにしたい 44 コンピュータの構成と設計(1994年版) から抜粋
  45. 45. やるべきことリスト • II=2 以上のパイプライン • 同時性の記述 • Verilog 入出力 Python の Verilog Parser はできた 45
  46. 46. 高位合成共通の課題(コミュ力重要) • インタフェース – 同時性の記述 – クロック単位の動作の保証 • ビット幅の柔軟性 def a_b(): a = 3 b = 4 c = a + b print(c) 直感的にわかりやすい 記述(時間の概念がない) 抽象的な int 表現 46
  47. 47. 妄想 47 def __init__(self, uart_class): obj = uart_class(19200) ... ~ Class を引き 渡せると楽 しくなりそう
  48. 48. 妄想 • AXIS への対応 48 Polyphony のモジュール を挿入!!
  49. 49. これからも Polyphony をよろしく!! ご清聴ありがとうございました 49 https://github.com/ktok07b6/polyphony うけませんでした。こういうことはやってはいけないみたいよ。
  50. 50. micro:bit One more thing 50
  51. 51. 無駄遣い micro:bit イギリスのBBCが主体となって作った教育向けのマイコンボードです。英国では 11歳〜12歳の子供全員に無償で配布されており、授業の中で活用が進んでい ます。 (スイッチサイエンスのウェブサイトから) 51
  52. 52. https://makecode.microbit.org/ ツールのインストールの必要性 がない 52
  53. 53. ウェブ上にシミュレータ 53
  54. 54. 完成プログラムはダウンロード 54
  55. 55. 書き込みは USB 経由 55
  56. 56. 実行!! Aボタンで A を表示 Bボタンで B を表示 揺らすと X を表示 (加速度センサ) 56
  57. 57. 参考:Blockly Python をサポート micro:bit とは直接関係ないが、google も blockly という block editor を 開発している。今後はやるのか? 57
  58. 58. ということでサーバ作ってみた 58
  59. 59. Python コード出来た 59
  60. 60. Verilog-HDL もできた!? 60 自動生成だから最早なんだかわからない。 ではあるが、出来てそうだぞ。 と日記には書いておこう
  61. 61. Polyphony サーバ!乞うご期待! 61
  62. 62. これからも Polyphony をよろしく!! ご清聴ありがとうございました 62

×