Upload
shinya-takamaeda-y
View
2.167
Download
10
Embed Size (px)
Citation preview
Veriloggen: Pythonによる
ハードウェアメタプログラミング
高前田 伸也
奈良先端科学技術大学院大学 情報科学研究科
E-mail: shinya_at_is_naist_jp
2015年12月8日 第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
Veriloggen
2015-12-08-HLS Shinya T-Y, NAIST 3
実行
Verilog HDL Python
PythonでVerilog HDLを 組み立てるライブラリ n Pythonで書いた動作を
HDLに変換する 高位合成ではない
n PythonのオブジェクトとしてVerilogの信号や代入を組み上げていく
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�
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チカチカ)
ハードウェア記述言語 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
好きな言語でハードウェア開発したい
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
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のソースコードのテキストに変換
例)たくさんLEDを追加してみる
2015-12-08-HLS Shinya T-Y, NAIST 9
実行
モジュール (Module) n 空のモジュールを作る: Moduleオブジェクトを作成する
l 引数はモジュール名
n Moduleオブジェクトのto_verilog()メソッドを呼び出すと 文字列形式でソースコードが取得できる
2015-12-08-HLS Shinya T-Y, NAIST 10
信号 (Input, Output, Wire, Reg) n Moduleオブジェクトの信号メソッドを呼び出すと 信号がモジュールに追加される l 引数は信号名,幅,初期値(Reg, Integerのみ)
2015-12-08-HLS Shinya T-Y, NAIST 11
代入 (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
代入 (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
制御 (If, For, While) n 制御オブジェクトを作る
l Ifオブジェクトの ElseメソッドでElse文が書ける
l For, While, Generateなどもある
n 制御オブジェクトもただの Pythonのオブジェクト l 定義の使い回しができる
2015-12-08-HLS Shinya T-Y, NAIST 14
サブモジュール (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
コード生成 (to_verilog) n Moduleオブジェクトのto_verilog()メソッドを呼び出すと 文字列形式でソースコードが取得できる
n Verilog HDLのソースコード解析・生成ツールキット Pyverilogを利用
2015-12-08-HLS Shinya T-Y, NAIST 16
既存の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
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
Seq: 順序回路
2015-12-08-HLS Shinya T-Y, NAIST 19
Seqオブジェクト生成
(count==interval-1)だったら led <= led + 1
2015-12-08-HLS Shinya T-Y, NAIST 20
2015-12-08-HLS Shinya T-Y, NAIST 21
FSM: 状態遷移 マシン
FSM オブジェクト 生成
現在のFSM ラベル取得
次に進む
条件付きで 次に進む
現在のFSMでの処理を追加
from/toを 指定して 状態遷移
toを 指定して 状態遷移
Pipeline: パイプライン回路のデータフロー設計
2015-12-08-HLS Shinya T-Y, NAIST 22
入力
Pipeline オブジェクト 生成
演算 出力
Pipeline: パイプライン回路のデータフロー設計
2015-12-08-HLS Shinya T-Y, NAIST 23
データフローグラフが出力できます
Simulation: シミュレーション支援
2015-12-08-HLS Shinya T-Y, NAIST 24
モジュール生成
パラメータ宣言を コピーする
ポート宣言を コピーする
同じ名前のポート・パラメータを接続
クロックを作ったり リセットを作ったり
波形生成
Simulation: シミュレーション支援
2015-12-08-HLS Shinya T-Y, NAIST 25
テスト対象の モジュール生成
シミュレータ オブジェクト生成
シミュレータ起動
波形シミュレータ起動
Simulation: シミュレーション支援 n GTKwaveで波形を観測できる
2015-12-08-HLS Shinya T-Y, NAIST 26
まとめ 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�