View
976
Download
1
Category
Preview:
Citation preview
PythonとVeriloggenを用いたRTL設計メタプログラミング
高前田伸也
奈良先端科学技術大学院大学情報科学研究科
E-mail: shinya_at_is_naist_jp
2016年3月2日第3回人工知能とHW/SW協調設計ワークショップ@宜野湾マリン支援センター
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
Verilogコードをオブジェクトとして表現
Moduleオブジェクト
Pythonの言語機能を用いてオブジェクトを組み立てる
(mの)Regオブジェクト
"count <= 0"オブジェクト
"count==1023"オブジェクト
Ifオブジェクト
(mの)Alwaysオブジェクト
完成したModuleオブジェクトをリターン
Trax2016-03 Shinya T-Y, NAIST 3
コード生成 (to_verilog)n Moduleオブジェクトのto_verilog()メソッドを呼び出すと文字列形式でソースコードが取得できる
n Verilog HDLのソースコード解析・生成ツールキットPyverilogを利用
Trax2016-03 Shinya T-Y, NAIST 4
Veriloggenの利用例:メソッド切り出しによるコーディングパターン再利用
RAM I/Fのコーディングパターン
2つのI/Fを追加
Trax2016-03 Shinya T-Y, NAIST 5
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
ソフトウェア要件
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
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
再掲: 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
では早速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
Trax2016-03 Shinya T-Y, NAIST 11
Lチカ本体生成
(blinkled)
テストベンチ生成(test)
本スクリプトを実行する際の
コード
Trax2016-03 Shinya T-Y, NAIST 12
早速Lチカ回路を合成・シミュレーションn hello_led.pyを実行する
n 波形(uut.vcd)をGTKwaveで観測するpython3 hello_led.py
gtkwave uut.vcd &
Trax2016-03 Shinya T-Y, NAIST 13
生成されたVerilog HDLコードを確認する
Trax2016-03 Shinya T-Y, NAIST 14
Veriloggen.FSMn HDLでのFSMの組み立ては面倒
n FSMライブラリを使おう
l addメソッドで代入を追加する
l クロックやリセットは後から付加する
l 代入条件や遅延が付加できる
• cond= ...
• delay= ...
l make_always()でalway文を生成
Trax2016-03 Shinya T-Y, NAIST 15
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
fsm_example.py (1): 入出力・FSMオブジェクト
n 好きに入出力を定義する(Input, Output, Reg, ...)n FSMオブジェクトを作る
l FSMオブジェクトにステート遷移情報を追加していく
Trax2016-03 Shinya T-Y, NAIST 17
fsm_example.py (2): FSM定義を追加していくgoto_next(): 次のステートに移る
add(): 現在のステートでの処理を追加するdelayを付けるとnサイクル遅れて実行される
add()・goto_next()共に condを付けると条件が成立するときのみ実行される
keepを付けるとnサイクル連続で実行される
Trax2016-03 Shinya T-Y, NAIST 18
fsm_example.py (3): Always文を合成する
必要があればreset文や追加の代入文を追加できる
モジュールオブジェクトmをリターン
Trax2016-03 Shinya T-Y, NAIST 19
動かしてみる
n fsm_example.pyを実行する
n 生成されたVerilog HDLコードを確認するpython3 fsm_example.py
emacs tmp.v
Trax2016-03 Shinya T-Y, NAIST 20
長いFSMができる
Trax2016-03 Shinya T-Y, NAIST 21
BRAMの例も見てみるn veriloggen/examples/bram を開く
cd veriloggen/examples/bramemacs bram.py
Trax2016-03 Shinya T-Y, NAIST 22
bram.py (1):BRAMの定義
n個のポートを追加する
Reg array
n個のAlways文を追加する
Trax2016-03 Shinya T-Y, NAIST 23
bram.py (2): BRAMを使う
BRAMの定義を生成
BRAMポートを追加する
BRAMインスタンスを作る
Trax2016-03 Shinya T-Y, NAIST 24
bram.py (3): BRAMにFSMを使ってアクセスする
FSMオブジェクトを作る
各ポートの初期値
各ポートの定義
Trax2016-03 Shinya T-Y, NAIST 25
動かしてみる
n bram.pyを実行する
n 生成されたVerilog HDLコードを確認するpython3 bram.py
emacs tmp.v
Trax2016-03 Shinya T-Y, NAIST 26
BRAMにアクセスするハードウェアができる
Trax2016-03 Shinya T-Y, NAIST 27
Veriloggen.Dataflow:オペレータオーバーロードによるデータフロー設計
SWとして実行可能な普通のPythonのメソッド定義
SWとして実行可能な普通のPythonのメソッド定義
Trax2016-03 Shinya T-Y, NAIST 28
例)4点FFT
Veriloggen.Dataflow:オペレータオーバーロードによるデータフロー設計
SWとして実行可能な普通のPythonのメソッド定義
データフロー変数の生成前述のメソッド定義に通常の変数ではなくデータフロー変数を渡す
出力ポート設定とVerilogモジュール生成
Trax2016-03 Shinya T-Y, NAIST 29
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点ソート
オペレータオーバーロードによる
データフロー変数の組み立て
add
add(+)演算子のオペレータ
オーバーロード
Dataflow.Plusオブジェクトをリターン
Trax2016-03 Shinya T-Y, NAIST 31
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
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
まとめ
n Veriloggenは便利!l 安定版はPyPIから
l 最新版はGitHubからどうぞ
git clone https://github.com/PyHDI/veriloggen.git
pip install veriloggen
Trax2016-03 Shinya T-Y, NAIST 34
Recommended