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.

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

PythonとVeriloggenを用いたRTL設計メタプログラミング(チュートリアル)(2016年3月2日 第3回人工知能とHW/SW協調設計ワークショップ @沖縄)

  • Be the first to comment

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

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

×