2018年5月11日金曜日

SystemC の sc_trace() をなるべく楽にする方法

SystemC で信号ダンプをするためには,自分でダンプしたい内部信号を階層含めて一個一個指定する必要があって超めんどくさい.一個一個,は他にも似たような記述があるので諦めるにしても,階層含めて,は根気良く書くのが無理なレベル.インスタンス階層ツリーを出してくれる機能とかあればいいんだけど,そういうのもなさげ.
どこのご家庭でもお困りですよね.
sc_trace( trace_f, hoge.fuga.signal_a, "hoge.fuga.signal_a" );
sc_trace( trace_f, hoge.piyo.signal_b, "hoge.piyo.signal_b" );

で,自分で試してみて,一番マシだと思った方法は,SC_CTOR() 内で sc_trace() すること.
#include <systemc.h>
#ifdef VCD_WAVE
#define TRACE( sig ) sc_trace( trace_f, sig, std::string( this->name()) + "." #sig )
extern sc_trace_file *trace_f;
#else
#define TRACE( sig )
#endif
SC_MODULE( hoge ){
sc_in_clk clk;
sc_in<bool> nrst;
sc_in<sc_uint<32>> a;
sc_in<sc_uint<32>> b;
sc_out<sc_uint<32>> c;
SC_CTOR( hoge )
//★不要 : clk( "clk" ), nrst( "nrst" ), a( "a" ), b( "b" ), c( "c" )
{
...
TRACE( clk );
TRACE( nrst );
TRACE( a );
TRACE( b );
TRACE( c );
}
...
};
view raw hoge.cpp hosted with ❤ by GitHub

this->name() で,インスタンス化されたときのこのモジュール名のフルパス名が取得できるので,sc_trace() の記述自体にはフルパスを記述する必要がなくなる.
この程度の記述であれば,ポート宣言のコピペ & 置換レベルで対応できる.
めんどくさいメンバイニシャライザでの信号名設定 (上記の★不要 の箇所) も不要.

なお trace_f は このモジュールがインスタンス化される前に sc_create_vcd_trace_file() しておく必要がある.

Cadence だとナントカ wizard でこの辺を自動化してくれるんだけど,パンピーには使えないしね...

0 件のコメント:

コメントを投稿