Pyverilog_toolboxの紹介
拙作、Pyverilog_toolboxについて紹介してみる。
Pyverilog_toolboxはPyverilogの構文解析機能を用いて、verilogによるデジタル設計/検証を助けるツールとして開発を行いました。
現在実装されている機能は、組み合わせ回路ループファインダー、コードクローンファインダー、レジスタマップアナライザー、カウンタアナライザーです。
これらの機能の紹介は後で説明するとして、まずはインストールの方法について説明します。
インストール方法
主にwindows環境について。
Python:
2.7系の最新版をインストールする。3系は…私は動かしたことはありません。
具体的なインストール方法は以下を参照してください↓
http://sphinx-users.jp/gettingstarted/install_windows.html
Icarus verilog:
↓ここでインストーラをダウンロードし、起動。
筆者はiverilog-0.9.7_setup.exe (latest stable release)と記述されるバージョン、
つまり最新の安定版を使用している。(2015/05/23現在)
Pyverilog:
↓のページの"InstallationI"を読んでインストール。
http://shtaxxx.github.io/Pyverilog/
他にもPGraphvizとPygraphvizを入れることで、
データフローの図示といったPyverilogの素敵機能を発動できるので本当はやりたいんだけどwindos環境ではなんか難しくてできんかった…。Pyverilog_toolboxには必要ないのでとりあえず省略。jinja2も入れても入れなくてもええです。
Pyverilog_toolbox:
(2015/7/8追記)
pipに対応しました。
$ pip install pyverilog_toolbox
でOKです。
上記ページの、右のほうにある"Download ZIP"をクリックし、任意のディレクトリで解凍する。
もしくはgithubを使用できる環境があるなら
$git clone https://github.com/fukatani/Pyverilog_toolbox.git
でいれてもよい。
動作確認(飛ばしてもよい):
コマンドプロンプトを立ち上げ、
(Pyverilog_toolbox展開先のディレクトリ)/pyverilog_toolbox/testcode
に移動する。
$ python test_ra.py
と打ち、
Ran 10 test in ****s
OK
というメッセージが表示されれば無事全ての機能が動いている。
試しにcombloop_finderを使ってみる。
組み合わせ回路ループと言うのはなかなかに厄介な問題である。
組み合わせ回路ループとは例えば以下の図のような回路のことで、
赤い矢印の部分のようにループにFFが挟まれていない回路のことである。
一度組み合わせ回路ループが出来てしまうと、発振してシミュレーションが全く進まなくなったり、ラッチが形成され思わぬ動作をしてしまったり、上司から冷たい目で見られたり、世界を崩壊から救えなかったりする危険性がある。
勿論セレブリチーなCADを使えば発見できるのだが、お金の力で環境を整えられない場合にはエンジニアが目で探すことになる。これがまた、しばしばノーヒントで大変な作業なのだ。
そのような問題を(無料で!)発見してくれるのが、
Pyverilog_toolboxに含まれるcombloop_finderです。
使い方は簡単で、コマンドプロンプトで
(Pyverilog_toolbox展開先のディレクトリ)/pyverilog_toolbox/verify_tool
に移動し、
python combloop_finder.py xxxx.v
を実行すればよい。ここでxxxx.vは任意のverilogファイルである。testcodeを使用したい場合、
python combloop_finder.py ../combloop.v
としてみましょう。
組み合わせ回路ループがある回路では
CombLoopException: Combinational loop is found @TOP.wire3
と例外として投げられる。
基点となっている信号(この場合はTOP.wire3)
も表示されるので探しに行く必要がない。便利だ。
組み合わせ回路ループが存在しない回路では
There is no combinational loop.
とメッセージが表示されます。
最後に注意として、
Pyverilogで読み込まれる回路のトップモジュール名はデフォルトでは"TOP"となっている。そしてTOPというモジュールが無い場合はエラーを吐く。
トップモジュール名が"TOP"でないときは、-tオプションでトップモジュール名を指定する。例えば先のcombloop_finderを使用する場合、
python combloop_finder.py xxxx.v -t TOP_DIG
のようにすることで、"TOP_DIG"モジュールをトップとして扱うことが出来る(存在しない場合はエラー)。
他の機能にはついてはまた今度。ミスとか質問とかあったらお気軽にどぞ。