技術解説
C、Tcl、HDLの連携の図

- Cプログラムでprintf()をすると、その文字列がTclインタプリタに送り込まれます。
- Tclインタプリタは、simForceによってHDL中の信号を操作します。
- Tclインタプリタは、simExamineによってHDL中の信号の状態を調べ、それをputs $oChannelでCプログラムに伝えます。
- Cプログラムはfgets()でTclインタプリタの出力を受け取ることによって、データバスなどの状態を知ります。
パイプは、fsm.tclのproc configにある、
set iChannel [open "|$channelTarget" r+]
で作成しています。
fsm.tclの記述中にはputs $oChannelしている個所はありませんが、noodlybox.cのreadGeneric()で「puts $oChannel $result」
をTclインタプリタに送り込んでいます。
TclでHDL中の信号状態の変化イベントを捕らえるために、whenやisim condition addを使っています。
また、信号の値の取得にはexamineを使っています。
fsm.tclでのオプションの渡し方・解釈の仕方
- ModelSimでは、変数argcでdoコマンドに渡されたオプションの個数が分かるので、$数字でそれらにアクセスできます。
- ISE Simulatorでは、オプションを渡す方法がわからなかったため、環境変数を使って受け渡しをしています。
- 解釈には、tcllibのcmdlineパッケージを使っています。
- tcllibはModelSimの中に含まれている(ModelSimのインストールディレクトリの中にtcl/tcllib1.xが存在します)ので、追加のインストール作業なしで使用できます。詳細はStandard Tcl Libraryを参照してください。
make depend
dpisampleでは、C++ソースにとってのヘッダへの依存記述を、make dependで自動作成するようにしました。
makefile中のincludeの前に'-'を挿入しておけば、ファイルが無くてもエラーメッセージが出なくなります。これにより、初回のmakeのときにmakefile.dependが無くても大丈夫になります。
-include makefile.dependがファイルの末尾にあるのは、ファイルの頭にあると'all'ではなくmakefile.dependに登場する最初の.oファイルが最終ターゲットにされてしまうからです。
onbreak
ModelSIMでは、シミュレーションを実行するスクリプトの中にonbreak { quit -force }と書いておくと、Verilog HDLの$stopに到達したときに自動的に終了してくれます。
sim.tclのように
clockコマンドを使用すれば、シミュレーションにかかった時間を表示することもできます。