はじめに
Bluespec SystemVerilog の中に、bluetcl なる tcl インタプリタがあります。今回は、この bluetcl を使ってみようと思います。
bluetcl を使うことでインタラクティブにシミュレーションを進めることができるようです。
例題
例題 (examples/smoke_test) にて、make smoke_test_bluesim を実行して、bluetcl から呼び出すための共有ライブラリを生成します。
cd examples/smoke_test make clean make smoke_test_bluesim
ここで、mkFibOne.bexe.so が生成されていることを確認します。
ls FibOne.bo Makefile mkFibOne.bexe mkFibOne.cxx mkFibOne.o model_mkFibOne.cxx model_mkFibOne.o FibOne.bsv mkFibOne.ba mkFibOne.bexe.so mkFibOne.h mkFibOne.out.expected model_mkFibOne.h smoke_test_bluesim.out
bluetcl を起動し、初期設定後、mkFibOne.bexe.so をロードします。
bluetcl % package require Bluesim % namespace import Bluesim::* % sim load mkFibOne.bexe.so mkFibOne
シミュレーションを実行します。
% sim step 10 0 1 1 2 3 5 8 13 21 % exit
スクリプトを使う
何回も同じコマンドを入力するのは面倒なので、コマンドをスクリプト(script.tcl) に書いておきます。
package require Bluesim namespace import Bluesim::* sim load mkFibOne.bexe.so mkFibOne sim step 10
bluetcl の引数にスクリプトのファイル名を渡して実行すると、スクリプトの内容を実行します。
bluetcl script.tcl 0 1 1 2 3 5 8 13 21
$HOME/.bluetclrc
$HOME/.bluetclrc に共通のコマンドを書いておけばいいようなので、
package require Bluesim namespace import Bluesim::*
を書き込んでおいて、bluetcl を実行し、sim とコマンドを打ち込んでも、エラーになるのはどうしてでしょうか?
$ cat ~/.bluetclrc package require Bluesim namespace import Bluesim::* $bluetcl % sim invalid command name "sim" % exit $
bluetcl のソースコード
bluetcl は、
- https://github.com/B-Lang-org/bsc/blob/7969a1e2ffb9ea9595d5e8de0de68dfc73b0fcfc/src/comp/bluetcl.hs
- bsc/src/comp/bluetcl_Main.hsc (Cコード)
です。bluetcl_Main.hsc が tclインタープリタのコードで、Bluespec関連のコードは bluetcl.hs です。
$HOME/.bluetclrx は、ここ で設定されています。
そして、下記の部分で Bluetcl の package を読み込んでいます。
stat = Tcl_PkgProvide(interp, "Bluetcl", "1.0");
Bluetclのパッケージは、ここにあります。
”Bluetcl" は、ここで次のように設定されています。
Tcl_StaticPackage( interp, "Bluetcl", Bluespec_Init, Bluespec_Init);
おわりに
bluetcl あるんですが、ドキュメントに書いてあることを実行してもうまくいかないのは何故?