電気回路/HDL/ISim 事始め
Xilinx が ModelSim の無償版&廉価版の配布を中止との情報†
http://marsee101.blog19.fc2.com/blog-entry-1570.html
Xilinx 向けには ModelSim は敷居の高い環境になってしまいました。
そこで、(しかたなく) ISim を使ってみることになりました。
これまでの感触では、ModelSim が使えないのはかなり致命的な 気がしているのですが、食わず嫌いだったと判明することを期待しながら。。。
# ModelSim の便利な使い方講座になってしまっているという話も
コンパイルとGUIの起動†
テストベンチ some_testbench.v に対して ISE から Simulate Behavioral Model をダブルクリックしたところ、起動プロセスは
- まず必要な *.v をコンパイルして some_testbench_isim_beh.exe というシミュレーション用
実行ファイルを生成
fuse -intstyle ise \ -incremental \ -d simulation \ -lib unisims_ver \ -lib unimacro_ver \ -lib xilinxcorelib_ver \ -o some_testbench_isim_beh.exe \ -prj some_testbench_beh.prj \ work.some_testbench work.glbl
- そして、ISim シミュレーションエンジン GUI を起動
some_testbench_isim_beh.exe \ -gui \ -tclbatch isim.cmd \ -wdb some_testbench_isim_beh.wdb
となっていました。
あれ?
ということは、ソースを修正したら GUI を一旦落とさないとリコンパイルできない???
GUI を落としたり再起動するのはかなり重い処理ですし、 そもそも一旦落として、もう一度 ISE 上でダブルクリックするのは手間がかかります。
- ISim でバグを発見
- ISim を参照しつつ ISE でソースファイルを編集
- ISim に戻って ISim を終了(毎回確認ウィンドウが表示される)
- ISE から再度 ISim を起動
- ISim でシミュレーションを再開
という手順でしょうか?
以下で見るように、ModelSim では GUI を落とすことなく、 Console ウィンドウから簡単にリコンパイル&再実行が行えたので、 それと比べてると面倒に感じられます。
- ModelSim でバグを発見
- ModelSim を参照しつつソースファイルを編集
(ISE 上でも可能ですし、ソースファイルウィンドウで右クリックから Read Only をはずせば ModelSim 上でも可能です) - ModelSim 上でリコンパイル&シミュレーション再開
(エイリアスを設定しておけば、たとえば re[ENTER] の3キーを押すだけで可能)
という手順で済んでいました。
設定ファイルについて†
標準ではシミュレーション起動時に実行するコマンドが isim.cmd に入ります。
isim.cmd
onerror {resume} run 1000 ns;
標準では wave ウィンドウの設定は無いため、シミュレーション結果は何も表示されず、 毎回信号線を wave ウィンドウに登録してからシミュレーションを restart して run することになります。
このあたりの設定は、Simulate Behavioral Model の Process Property から 変更できるようでした。
標準では起動時に wave ウィンドウは空のままですが、wave ウィンドウ設定を、 例えば some_testbench.wcfg という名前で保存しておくとすれば、 Process Properties の Use Custom Waveform Configuration File にチェックを付けて、 このファイル名を指定しておくことで、始めから wave ウィンドウの設定が読み込まれます。
同様にテストベンチごとに異なる名前の起動コマンドファイルを取っておきたければ、 例えば some_testbench.cmd というファイルにコマンドを記述しておき、 Use Custom Simulation Command File にチェックを入れてファイル名を 指定しておくことができるようです。
ただ、このような変更が可能とはいえ・・・
設定がテストベンチソースのプロパティではなく、 Process のプロパティとして保存されるため、 異なるテストベンチを走らせても、毎回同一の設定で起動してしまいます。
すなわち、異なるテストベンチを走らせる前に、 Process Properties を開いて、 上記2つの設定ファイル名を書き換えなければなりません?
これは非常に面倒です。
ModelSim を使う場合、この *.cmd および *.wcfg にあたるのは some_testbench.udo と some_testbench_wave.fdo のような名前付けになっていて、 テストベンチごとに自動的に正しいファイルが使われるので、 異なるテストベンチを起動するごとに設定を書き換えるような煩雑さはありませんでした。
このあたりは ISim の問題というよりも、ISE 側の問題ですね。
これまで Xilinx 自身、ModelSim がメインで ISim と ISE との連携をあまり考えてこなかったということでしょうか。 ISE の ISim 対応が早急に進むことを期待します。
wcfg open コマンド†
tcl から wcfg open コマンドで波形ウィンドウの定義を読み込めるので、
*.cmd ファイルにこのコマンドを書いておけば、ISE のプロパティで
*.wcfg ファイルを指定する必要は無くなるようです。
コマンドのエイリアス†
シミュレータの Console ウィンドウで、 一連のコマンドを連続して実行したい場合や、 長いコマンドを簡単に入力するために、 ModelSim では alias というコマンドを使って新しいコマンドを 作ることができました。
例えば wave ウィンドウに信号線を追加した後など、 シミュレーションを再起動して、 10 us 走らせたい時、Console ウィンドウで
ModelSim> restart -f ModelSim> run 10us
と打てばいいのですが、これを毎回手で打つのは面倒です。
(-f のオプションにより確認ウィンドウを出さずに再起動できます)
そこで以下のように rs という新しいコマンドを作っておくと、
rs と2文字打つだけでコマンドを実行することができました。
ModelSim> alias rs "restart -f; run 10us" ModelSim> rs
その他にも、例えば
ModelSim> alias r "run 100ns" ModelSim> alias re "do {some_testbench.fdo}" ModelSim> alias sv "write format wave some_testbench_wave.fdo" ModelSim> alias q "quit -f"
としておけば、
- r で 100 ns 進める
- re でソースのリコンパイル&再実行
- sv でウェーブウィンドウの設定を保存
- q で確認されずにシミュレータを終了
(ModelSim は落とさなくてもリコンパイルできるので、 落とすのは本当にシミュレーションが終わったときだけですが)
など、非常に便利に使えました。
ModelSim ではこのような alias 指定を some_testbench.udo に入れておくことで、 some_testbench.v テストベンチを起動した直後からこれらのエイリアスが利用できます。
ISim のマニュアルで Alias の項を探したところ、あるにはあったのですが・・・
ISim> set rs "restart; run 10us" ISim> eval $rs
というのが、対応する方法だそうです。
やっているのは、rs という名前の文字列変数に値を入れておいて、
それを eval (evaluate) しているわけですが、、、
これはエイリアスって言いません!
ModelSim> rs ISim> eval $rs
タイプ量違いすぎです(泣
ModelSim では alias があるのに ISim ではどうしてできないんだ、 という質問への苦しい回答なのでしょうが・・・
全然うれしくないです。
使える tcl コマンドの種類もかなり少ないようですね。
ModelSim では、ISE でもできないようなこと、 例えば Verilog ファイルのリコンパイル前に外部コマンドとして make を起動して、 PicoBlaze のアセンブリ言語をアセンブルしたり、 他のソースファイルを変換してメモリ内容を表す *.mem ファイルを更新したり といったことまで ModelSim 内から行えます。
ISim ではそうはいかないようですね。
ファンクションキー†
ISim では
- F5 に "run all"
- Ctrl+Shift+F5 に "restart"
- F11 に "step"
が割り当てられているそうです。
`define を使ったマクロ定義†
ISim でも `define を使って引数を持つマクロを定義できるように なったとのことで、試したところ `" を使って文字列中で引数を 展開することも可能でした。
したがって、 $messagelog を利用するマクロ で書いていたような、ASSERT のようなマクロを記述することは ISim でも可能なようです。
バッチモードでの起動†
起動時に -gui を付けなければ、バッチモードで実行できるとのことです。
LANG:console some_testbench_isim_beh.exe -tclbatch isim.cmd
多数のテストベンチを順に起動し、 テストが成功するか、失敗するか、のみを知りたいときなど 便利に使えると思ってやってみたのですが・・・
コマンドプロンプトから プロジェクトディレクトリに移動し、 上記コマンドを実行したところ、
LANG:console some_testbench_isim_beh.exe は動作を停止しました 問題が発生したため、プログラムが正しく動作しなく なりました。このプログラムを閉じて下さい -> プログラムを終了します -> プログラムをデバッグします
のエラーが発生してしまいました。
これは、インストール時に環境変数が正しく設定されていなかったせいでした。
(複数のバージョンを同時にインストールしていた)
環境変数を設定するための .bat ファイルが
C:\Xilinx\12.2\ISE_DS\ISE\settings32.bat
にあったので、それを実行したらうまくいきました。
LANG:console C:\someproj>C:\Xilinx\12.2\ISE_DS\ISE\settings32.bat C:\someproj>some_testbench_isim_beh.exe -tclbatch isim.cmd
後は、テストが成功したか、失敗したかを起動側に通知できれば、 多数のテストを連続して動かし、その正否を一覧表示することも できそうです。
こうしてみると†
まず Xilinx に手を付けて欲しいのは、ISim 自体の改善よりも、 ISE の ISim 対応状況の改善ですね。
現状ではあまりに使いにくい・・・
私の使い方が悪いのだったらうれしいので、 良い方法を教えていただけるとありがたいです!
コメント†
バッチファイルを使っています†
[marsee] (2010-08-29 (日) 16:16:29)
ISimは簡単に使うとき以外は、バッチファイルを作って、そこから起動しています。学生実験でもModelSimを使うのをやめて、ISimになりました。ISimもVHDL, Verilog混在環境も行けますので、私には便利です。VPIが使えるのかどうかは分かりません?
以前から、ISimをだいぶ整備してきて、ModelSimの扱いが弱くなってきたので、危ないかな?と思っていました。
http://marsee101.blog19.fc2.com/blog-category-66.html
- 書き込みありがとうございます。コマンドラインからのテスト起動もうまく行きましたので、バッチファイルあるいはMakefile経由での起動を検討してみようと思います。 -- [武内(管理人)]