34
PythonVeriloggenを用いた RTL設計メタプログラミング 高前田 伸也 奈良先端科学技術大学院大学 情報科学研究科 E-mail: shinya_at_is_naist_jp 2016323回人工知能とHW/SW協調設計 ワークショップ @宜野湾マリン支援センター

PythonとVeriloggenを用いたRTL設計メタプログラミング

Embed Size (px)

Citation preview

Page 1: PythonとVeriloggenを用いたRTL設計メタプログラミング

PythonとVeriloggenを用いたRTL設計メタプログラミング

高前田伸也

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

E-mail: shinya_at_is_naist_jp

2016年3月2日第3回人工知能とHW/SW協調設計ワークショップ@宜野湾マリン支援センター

Page 2: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggen[高前田,IEICE RECONF'15]:PythonによるRTLメタプログラミング

Design Generator by Python

from veriloggen import *m = Module('blinkled')clk = m.Input('CLK')led = m.Output('LED', 8)count = m.Reg('count', 32)m.Assign( led(count[31:24]) )m.Always(Posedge(clk)(

count( count + 1 ) )hdl = m.to_verilog()print(hdl)

blinkled

CLK RST

LED count

assignalways

Veriloggen Object

module blinkled (input CLK,output [7:0] LED

);reg [31:0] count;assign LED = count[31:24];always @(posedge CLK) begincount <= count + 1;

endendmodule

Verilog Source Code

module

input

CLK

input

RST

blinkled

Verilog AST

to_verilog()

Verilog AST

Generator

Verilog Code

Generator

Run on Python Interpreter

Verilog HDLコードの組み立てルールをPythonの言語機能を活用して記述

Verilog HDLによる回路記述・

テストベンチが生成される

実行

Trax2016-03 Shinya T-Y, NAIST 2

Page 3: PythonとVeriloggenを用いたRTL設計メタプログラミング

Verilogコードをオブジェクトとして表現

Moduleオブジェクト

Pythonの言語機能を用いてオブジェクトを組み立てる

(mの)Regオブジェクト

"count <= 0"オブジェクト

"count==1023"オブジェクト

Ifオブジェクト

(mの)Alwaysオブジェクト

完成したModuleオブジェクトをリターン

Trax2016-03 Shinya T-Y, NAIST 3

Page 4: PythonとVeriloggenを用いたRTL設計メタプログラミング

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

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

Trax2016-03 Shinya T-Y, NAIST 4

Page 5: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggenの利用例:メソッド切り出しによるコーディングパターン再利用

RAM I/Fのコーディングパターン

2つのI/Fを追加

Trax2016-03 Shinya T-Y, NAIST 5

Page 6: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggenとその他の処理系との違い

n 高位合成や高位DSLはソースコードそのものが回路定義l リフレクションを利用:ソースコード情報を取得

l ソースコードを「コンパイラで」解析しデータフロー等に変換

l 回路を追加するにはソースコードを追加する必要がある

• 頻出パターンもコード化しないといけないL

l 生成元言語のサブセットのみ対応L

n Veriloggenは明示的にHDLを組み立てるl リフレクション未使用:ソースコードそのもの定義は無関係

l ソースコードの「実行」によりデータフロー等を構築

l 回路の追加は明示的なオブジェクト操作で実現される

• 頻出パターンはメソッド切り出しができるJ

l 生成元言語のすべての機能を利用できるJ

l ソフトウェア文法をそのままHW化はできないL

Trax2016-03 Shinya T-Y, NAIST 6

Page 7: PythonとVeriloggenを用いたRTL設計メタプログラミング

ソフトウェア要件

n 対応OS:Pythonとiverilogが動作すれば何でもOKなはずl 普段は Ubuntu 14.04とMac OS X 10.11 で検証しています

n 必要なソフトウェア

l Icarus Verilog: 0.9.6 以上(ただし10.xはNG)l Python: 2.7 or 3.4 以上(3.5がおすすめ)

l Python pip(Pythonパッケージ管理ソフトウェア): 7.1.2 以上

l virtualenv(Python仮想環境管理ツール,推奨): 12.0.7 以上• "pip install virtualenv" でインストールできる

l pytest, pytest-pythonpath(テスト用ツール,必要があれば)• pytest: 2.8.2, pytest-pythonpath: 0.7 以上

• "pip install pytest pytesth-pythonpath" でインストールできる

l git(バージョン管理,推奨)

Trax2016-03 Shinya T-Y, NAIST 7

Page 8: PythonとVeriloggenを用いたRTL設計メタプログラミング

Getting Started, Veriloggen!n python3, pip, virtualenvはインストール済みとしますn Virtualenv環境を作る

n Veriloggenをインストールするl スライド作成時(2016年3月1日)の最新版 0.6.1

n 以上(簡単でしょ?)

mkdir test_vgcd test_vgvirtualenv --python=python3 .source bin/activatepip install pytest pytest-pythonpath

pip install veriloggen

Trax2016-03 Shinya T-Y, NAIST 8

Page 9: PythonとVeriloggenを用いたRTL設計メタプログラミング

再掲: Veriloggenを用いたRTL設計フロー

Design Generator by Python

from veriloggen import *m = Module('blinkled')clk = m.Input('CLK')led = m.Output('LED', 8)count = m.Reg('count', 32)m.Assign( led(count[31:24]) )m.Always(Posedge(clk)(

count( count + 1 ) )hdl = m.to_verilog()print(hdl)

blinkled

CLK RST

LED count

assignalways

Veriloggen Object

module blinkled (input CLK,output [7:0] LED

);reg [31:0] count;assign LED = count[31:24];always @(posedge CLK) begincount <= count + 1;

endendmodule

Verilog Source Code

module

input

CLK

input

RST

blinkled

Verilog AST

to_verilog()

Verilog AST

Generator

Verilog Code

Generator

Run on Python Interpreter

Verilog HDLコードの組み立てルールをPythonの言語機能を活用して記述

Verilog HDLによる回路記述・

テストベンチが生成される

実行

Trax2016-03 Shinya T-Y, NAIST 9

Page 10: PythonとVeriloggenを用いたRTL設計メタプログラミング

では早速Lチカn サンプルコード一式をダウンロードする

n veriloggen/hello_led.py を開く

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

cd veriloggenemacs hello_led.py

Trax2016-03 Shinya T-Y, NAIST 10

Page 11: PythonとVeriloggenを用いたRTL設計メタプログラミング

Trax2016-03 Shinya T-Y, NAIST 11

Page 12: PythonとVeriloggenを用いたRTL設計メタプログラミング

Lチカ本体生成

(blinkled)

テストベンチ生成(test)

本スクリプトを実行する際の

コード

Trax2016-03 Shinya T-Y, NAIST 12

Page 13: PythonとVeriloggenを用いたRTL設計メタプログラミング

早速Lチカ回路を合成・シミュレーションn hello_led.pyを実行する

n 波形(uut.vcd)をGTKwaveで観測するpython3 hello_led.py

gtkwave uut.vcd &

Trax2016-03 Shinya T-Y, NAIST 13

Page 14: PythonとVeriloggenを用いたRTL設計メタプログラミング

生成されたVerilog HDLコードを確認する

Trax2016-03 Shinya T-Y, NAIST 14

Page 15: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggen.FSMn HDLでのFSMの組み立ては面倒

n FSMライブラリを使おう

l addメソッドで代入を追加する

l クロックやリセットは後から付加する

l 代入条件や遅延が付加できる

• cond= ...

• delay= ...

l make_always()でalway文を生成

Trax2016-03 Shinya T-Y, NAIST 15

Page 16: PythonとVeriloggenを用いたRTL設計メタプログラミング

FSMライブラリを使ってみるn veriloggen/examples/fsm_example を開く

l examples, testsにサンプルが多数あります

l FSMの例としては examples/bramもおすすめ

cd veriloggen/examples/fsm_exampleemacs fsm_example.py

Trax2016-03 Shinya T-Y, NAIST 16

Page 17: PythonとVeriloggenを用いたRTL設計メタプログラミング

fsm_example.py (1): 入出力・FSMオブジェクト

n 好きに入出力を定義する(Input, Output, Reg, ...)n FSMオブジェクトを作る

l FSMオブジェクトにステート遷移情報を追加していく

Trax2016-03 Shinya T-Y, NAIST 17

Page 18: PythonとVeriloggenを用いたRTL設計メタプログラミング

fsm_example.py (2): FSM定義を追加していくgoto_next(): 次のステートに移る

add(): 現在のステートでの処理を追加するdelayを付けるとnサイクル遅れて実行される

add()・goto_next()共に condを付けると条件が成立するときのみ実行される

keepを付けるとnサイクル連続で実行される

Trax2016-03 Shinya T-Y, NAIST 18

Page 19: PythonとVeriloggenを用いたRTL設計メタプログラミング

fsm_example.py (3): Always文を合成する

必要があればreset文や追加の代入文を追加できる

モジュールオブジェクトmをリターン

Trax2016-03 Shinya T-Y, NAIST 19

Page 20: PythonとVeriloggenを用いたRTL設計メタプログラミング

動かしてみる

n fsm_example.pyを実行する

n 生成されたVerilog HDLコードを確認するpython3 fsm_example.py

emacs tmp.v

Trax2016-03 Shinya T-Y, NAIST 20

Page 21: PythonとVeriloggenを用いたRTL設計メタプログラミング

長いFSMができる

Trax2016-03 Shinya T-Y, NAIST 21

Page 22: PythonとVeriloggenを用いたRTL設計メタプログラミング

BRAMの例も見てみるn veriloggen/examples/bram を開く

cd veriloggen/examples/bramemacs bram.py

Trax2016-03 Shinya T-Y, NAIST 22

Page 23: PythonとVeriloggenを用いたRTL設計メタプログラミング

bram.py (1):BRAMの定義

n個のポートを追加する

Reg array

n個のAlways文を追加する

Trax2016-03 Shinya T-Y, NAIST 23

Page 24: PythonとVeriloggenを用いたRTL設計メタプログラミング

bram.py (2): BRAMを使う

BRAMの定義を生成

BRAMポートを追加する

BRAMインスタンスを作る

Trax2016-03 Shinya T-Y, NAIST 24

Page 25: PythonとVeriloggenを用いたRTL設計メタプログラミング

bram.py (3): BRAMにFSMを使ってアクセスする

FSMオブジェクトを作る

各ポートの初期値

各ポートの定義

Trax2016-03 Shinya T-Y, NAIST 25

Page 26: PythonとVeriloggenを用いたRTL設計メタプログラミング

動かしてみる

n bram.pyを実行する

n 生成されたVerilog HDLコードを確認するpython3 bram.py

emacs tmp.v

Trax2016-03 Shinya T-Y, NAIST 26

Page 27: PythonとVeriloggenを用いたRTL設計メタプログラミング

BRAMにアクセスするハードウェアができる

Trax2016-03 Shinya T-Y, NAIST 27

Page 28: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggen.Dataflow:オペレータオーバーロードによるデータフロー設計

SWとして実行可能な普通のPythonのメソッド定義

SWとして実行可能な普通のPythonのメソッド定義

Trax2016-03 Shinya T-Y, NAIST 28

例)4点FFT

Page 29: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggen.Dataflow:オペレータオーバーロードによるデータフロー設計

SWとして実行可能な普通のPythonのメソッド定義

データフロー変数の生成前述のメソッド定義に通常の変数ではなくデータフロー変数を渡す

出力ポート設定とVerilogモジュール生成

Trax2016-03 Shinya T-Y, NAIST 29

Page 30: PythonとVeriloggenを用いたRTL設計メタプログラミング

Veriloggen.Dataflow:データフローグラフ

delay

dout3

delay

R

delay

R

delay

R

Cond

R

<

0

Cond

0

<

R

delay

R

Cond

0

Cond

01 2

delay

R

<

R

delay

R

Cond

L

delay

R

2 1

<

0

Cond

0

<

R

delay

R

Cond

0

Cond

0 1 2

L

delay

R

delay

R

Cond

L

delay

R

2 1

<

0

Cond

0

delay

R

delay

R

L

delay

R

din0

L

delay

R

21

din1

R

delay

R

12

delay

R

delay

R

1 2

delay

R

din2

R

delay

R

delay

R

1 2

delay

R

delay

R

delay

R

din3

R

delay

dout2

R

Cond

0

Cond

02 1

dout0 dout1

2 1

delay

R

L

delay

R

2 1

1 2

Trax2016-03 Shinya T-Y, NAIST 30データフローグラフ生成

遅延レジスタが自動挿入されたパイプライン回路

パイプライン入力

パイプライン出力

例)4点ソート

Page 31: PythonとVeriloggenを用いたRTL設計メタプログラミング

オペレータオーバーロードによる

データフロー変数の組み立て

add

add(+)演算子のオペレータ

オーバーロード

Dataflow.Plusオブジェクトをリターン

Trax2016-03 Shinya T-Y, NAIST 31

Page 32: PythonとVeriloggenを用いたRTL設計メタプログラミング

Dataflowライブラリを使ってみる: FFTn veriloggen/examples/dataflow_fft4 を開く

l 他にも dataflow_fftN, dataflow_sort, dataflow_matmulがある

n 動かしてみる

n こんな感じ

l 左は整数としての結果,右は固定小数としての結果

cd veriloggen/examples/dataflow_fft4emacs dataflow_fft4.py

python3 dataflow_fft4.py

Trax2016-03 Shinya T-Y, NAIST 32

Page 33: PythonとVeriloggenを用いたRTL設計メタプログラミング

Dataflowライブラリを使ってみる: ソートn veriloggen/examples/dataflow_sort を開く

n 動かしてみる

n こんな感じ

l 入力は [100, 99, 98, ..., 93]

l 出力は [93, ..., 98, 99, 100]になるはず

l 上がIcarus Verilogでの結果l 下がSWとして同一メソッドの実行結果→一致している!

cd veriloggen/examples/dataflow_sortemacs dataflow_sort.py

python3 dataflow_sort.py

Trax2016-03 Shinya T-Y, NAIST 33

Page 34: PythonとVeriloggenを用いたRTL設計メタプログラミング

まとめ

n Veriloggenは便利!l 安定版はPyPIから

l 最新版はGitHubからどうぞ

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

pip install veriloggen

Trax2016-03 Shinya T-Y, NAIST 34