Vengineerの妄想

人生を妄想しています。

Bluespec Systemverilog の bluetcl を使ってみる

はじめに

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 は、

です。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 あるんですが、ドキュメントに書いてあることを実行してもうまくいかないのは何故?