veriloggen: pythonによるハードウェアメタプログラミング(第3回...

27
Veriloggen: Pythonによる ハードウェアメタプログラミング 高前田 伸也 奈良先端科学技術大学院大学 情報科学研究科 E-mail: shinya_at_is_naist_jp 20151283回 高位合成友の会 @ドワンゴ

Upload: shinya-takamaeda-y

Post on 08-Jan-2017

2.167 views

Category:

Technology


10 download

TRANSCRIPT

Page 1: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Veriloggen: Pythonによる

ハードウェアメタプログラミング

高前田 伸也

奈良先端科学技術大学院大学 情報科学研究科

E-mail: shinya_at_is_naist_jp

2015年12月8日 第3回 高位合成友の会 @ドワンゴ

Page 2: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

PyCoRAM:Python-VerilogハイブリッドHLS

2015-12-08-HLS Shinya T-Y, NAIST 2

データパス 制御

Memory/Stream DMAコントローラ

Cha

nnel

/R

egis

ter

IO C

hann

el/

IO R

egis

ter

Computing Logic Modeled in Verilog HDL

Control Thread Modeled in Python

Page 3: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Veriloggen

2015-12-08-HLS Shinya T-Y, NAIST 3

実行

Verilog HDL Python

PythonでVerilog HDLを 組み立てるライブラリ n  Pythonで書いた動作を

HDLに変換する 高位合成ではない

n  PythonのオブジェクトとしてVerilogの信号や代入を組み上げていく

Page 4: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

GitHub/PyPiからダウンロード・インストール

n ついさっきバージョン0.5.3をリリースしました! n  GitHub:

https://github.com/PyHDI/veriloggen

n  PyPI (pip): https://pypi.python.org/pypi/veriloggen

2015-12-08-HLS Shinya T-Y, NAIST 4

$ pip install veriloggen�

$ git clone https://github.com/PyHDI/veriloggen.git�

Page 5: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

RTL representation using Verilog HDL

2015-12-08-HLS Shinya T-Y, NAIST 5

count (32-bit) +

Truncate

inv

32

32

32

8

8

LED top

32 1 Combinational

Circuit

Sequential Circuit

Combinational Circuit

Blinking LED (LEDチカチカ)

Page 6: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

ハードウェア記述言語 HDL (Hardware Description Language) n ハードウェア設計のためのDSL

l ソフトウェアプログラミング言語との違い •  (多くの)プログラミング言語は逐次動作の記述のためのもの

•  HDLは単位時刻毎の並列の振る舞いを記述するためのも

n  Verilog HDL/VHDLの問題点 l すべてをレジスタ転送レベルで書かなければならないため大変

l 抽象度・再利用性が低い

n  Verilog HDL/VHDLに変わる新しいHDL l  Bluespec: System Verilog + Haskell風味

l  Chisel: Scalaベースのハードウェア設計DSL

l  MyHDL: PythonベースHDL

l  Synthesijer.Scala: ScalaでHDLを生成

2015-12-08-HLS Shinya T-Y, NAIST 6

Page 7: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

好きな言語でハードウェア開発したい

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で書きたい! –  発表者はPythonで書きたいのでこれからもいろいろやってみます

–  でも他の言語も検討中です

2015-12-08-HLS Shinya T-Y, NAIST 7

Page 8: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Veriloggen

2015-12-08-HLS Shinya T-Y, NAIST 8

実行

Verilog HDL Python

PythonでVerilog HDLを 組み立てるライブラリ n  Pythonで書いた動作を

HDLに変換する 高位合成ではない

n  PythonのオブジェクトとしてVerilogの信号や代入を組み上げていく

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

Page 9: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

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

2015-12-08-HLS Shinya T-Y, NAIST 9

実行

Page 10: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

モジュール (Module) n 空のモジュールを作る: Moduleオブジェクトを作成する

l 引数はモジュール名

n  Moduleオブジェクトのto_verilog()メソッドを呼び出すと 文字列形式でソースコードが取得できる

2015-12-08-HLS Shinya T-Y, NAIST 10

Page 11: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

信号 (Input, Output, Wire, Reg) n  Moduleオブジェクトの信号メソッドを呼び出すと 信号がモジュールに追加される l 引数は信号名,幅,初期値(Reg, Integerのみ)

2015-12-08-HLS Shinya T-Y, NAIST 11

Page 12: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

代入 (Assign, Always) n  Moduleオブジェクトの

Assign, Alwaysメソッドを使う l 代入は信号オブジェクトの 呼び出しで表現: count(value)

n  Alwaysメソッド l センシティビティリストが取れる

l  Always文中での代入は ノンブロッキング

l 複数の文を書ける (begin – end)

n  Assignメソッド l 代入されたオブジェクトを渡す

2015-12-08-HLS Shinya T-Y, NAIST 12

Page 13: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

代入 (Assign, Always) n  Moduleオブジェクトの

Assign, Alwaysメソッドを使う l 代入は信号オブジェクトの 呼び出しで表現: count(value)

n  Alwaysメソッド l センシティビティリストが取れる

l  Always文中での代入は ノンブロッキング

l 複数の文を書ける (begin – end)

n  Assignメソッド l 代入されたオブジェクトを渡す

2015-12-08-HLS Shinya T-Y, NAIST 13

Page 14: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

制御 (If, For, While) n 制御オブジェクトを作る

l  Ifオブジェクトの ElseメソッドでElse文が書ける

l  For, While, Generateなどもある

n 制御オブジェクトもただの Pythonのオブジェクト l 定義の使い回しができる

2015-12-08-HLS Shinya T-Y, NAIST 14

Page 15: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

サブモジュール (Instance) n  ModuleオブジェクトのInstanceメソッドで追加する

l サブモジュール定義(sub),インスタンス名('uut'), パラメータマップ(param_args (リスト・タプル形式)), ポートマップ(port_args (リスト・タプル形式))

l  copy_params/ports/sim_ports()や connect_params/ports()などの便利メソッド

2015-12-08-HLS Shinya T-Y, NAIST 15

Page 16: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

コード生成 (to_verilog) n  Moduleオブジェクトのto_verilog()メソッドを呼び出すと 文字列形式でソースコードが取得できる

n  Verilog HDLのソースコード解析・生成ツールキット Pyverilogを利用

2015-12-08-HLS Shinya T-Y, NAIST 16

Page 17: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

既存のVerilog HDLソースコードの取り込み n  read_verilog_module(), read_verilog_module_str()で 既存のソースコードをModuleオブジェクトに変換できる l 辞書形式で一覧を返すので名前をキーにModuleが取得できる

n 変換後は通常の Moduleオブジェクト と同じように扱える l  Module名の変更, 変数や代入を追加, など

l もちろんVerilogの ソースコードへの 変換もできる

2015-12-08-HLS Shinya T-Y, NAIST 17

Page 18: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Veriloggen拡張ライブラリ n  Veriloggenの基本機能はVerilog HDLと同等の記述能力

l 抽象度はほとんど変わらないが,Pythonの言語機能を利用して Verilog HDLのソースコードを組み立てることができる

n より高い抽象度で設計するには? →Veriloggenの基本機能をラップしたライブラリ l  Seq: 順序回路

l  FSM: 状態遷移マシン

l  Pipeline: パイプライン回路のデータフロー型設計

l  Simulation: シミュレーション支援

2015-12-08-HLS Shinya T-Y, NAIST 18

Page 19: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Seq: 順序回路

2015-12-08-HLS Shinya T-Y, NAIST 19

Seqオブジェクト生成

(count==interval-1)だったら led <= led + 1

Page 20: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

2015-12-08-HLS Shinya T-Y, NAIST 20

Page 21: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

2015-12-08-HLS Shinya T-Y, NAIST 21

FSM: 状態遷移 マシン

FSM オブジェクト 生成

現在のFSM ラベル取得

次に進む

条件付きで 次に進む

現在のFSMでの処理を追加

from/toを 指定して 状態遷移

toを 指定して 状態遷移

Page 22: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Pipeline: パイプライン回路のデータフロー設計

2015-12-08-HLS Shinya T-Y, NAIST 22

入力

Pipeline オブジェクト 生成

演算 出力

Page 23: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Pipeline: パイプライン回路のデータフロー設計

2015-12-08-HLS Shinya T-Y, NAIST 23

データフローグラフが出力できます

Page 24: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Simulation: シミュレーション支援

2015-12-08-HLS Shinya T-Y, NAIST 24

モジュール生成

パラメータ宣言を コピーする

ポート宣言を コピーする

同じ名前のポート・パラメータを接続

クロックを作ったり リセットを作ったり

波形生成

Page 25: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Simulation: シミュレーション支援

2015-12-08-HLS Shinya T-Y, NAIST 25

テスト対象の モジュール生成

シミュレータ オブジェクト生成

シミュレータ起動

波形シミュレータ起動

Page 26: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

Simulation: シミュレーション支援 n  GTKwaveで波形を観測できる

2015-12-08-HLS Shinya T-Y, NAIST 26

Page 27: Veriloggen: Pythonによるハードウェアメタプログラミング(第3回 高位合成友の会 @ドワンゴ)

まとめ n  PythonでVerilog HDLを組み立てるライブラリ

l  PythonのオブジェクトとしてVerilogの信号や代入を組み上げる

n オープンソースで開発中 l  GitHub:

https://github.com/PyHDI/veriloggen

l  PyPI (pip): https://pypi.python.org/pypi/veriloggen

2015-12-08-HLS Shinya T-Y, NAIST 27

$ pip install veriloggen�

$ git clone https://github.com/PyHDI/veriloggen.git�