SystemCのエラボレーション・フェーズ
説明
エラボレーション・フェーズは、シミュレーション開始前のフェーズ。
ここでは、つぎの作業をしている
ここでは、つぎの作業をしている
- データ構造の初期化
- 接続関係の構築
- もし、sc_in<>、sc_out<>等が接続されていない場合エラーを出力する
- 次の実行フェーズの前処理(end_of_elaboration)
SystemCでは3つのフェーズが存在する。
- エラボレーション・フェーズ
- 実行フェーズ
- クリーンアップ・フェーズ
sc_start()が実行されると、まずエラボレーション・フェーズにはいる。
シミュレーションは実行フェーズである。
sc_start()から抜けるとクリーンアップ・フェーズにはいる。
シミュレーションは実行フェーズである。
sc_start()から抜けるとクリーンアップ・フェーズにはいる。
sc_moduleには、次の4つのvirtual関数が存在する。
- before_end_of_elaboration
- end_of_elaboration
- start_of_simulation
- end_of_simulation
どのような順番で呼ばれるのか気になったので実験してみた。
実験
- main.cpp
#include <systemc.h>
#include "mod.h"
int sc_main( int argc, char* argv[] )
{
MOD *mod;
printf("main::begin\n");
mod = new MOD( "mod" );
printf( "main::exec sc_start\n" );
sc_start( -1 );
printf( "main::end\n" );
return 0;
}
- MOD.h
#ifndef __MOD_H
#define __MOD_H
#include <systemc.h>
SC_MODULE( MOD )
{
SC_CTOR( MOD ) {
printf( "mod::constructor\n" );
SC_THREAD( thread_proc );
}
~MOD() {
printf( "mod::destructor\n" );
}
void thread_proc()
{
printf( "mod::exec sc_stop\n" );
sc_stop();
}
void before_end_of_elaboration() {
printf( "mod::before_end_of_elaboration\n" );
}
void end_of_elaboration() {
printf( "mod::end_of_elaboration\n" );
}
void start_of_simulation() {
printf( "mod::start_of_simulation\n" );
}
void end_of_simulation() {
printf( "mod::end_of_simulation\n" );
}
};
#endif /* __MOD_H */
- 実行結果
main::begin mod::consructor main::exec sc_start mod::before_end_of_elaboration mod::end_of_elaboration mod::start_of_simulation mod::exec sc_stop SystemC: simulation stopped by user. mod::end_of_simulation main::end
sc_startが実行されると
- before_end_of_elaboration()
- エラボレーション実行
- end_of_elaboration()
- start_of_simulation()
- シミュレーション開始
という順番で関数が呼ばれる。
sc_stopが実行されると
- end_of_simulation
が実行され、sc_start()内の無限ループから抜けてsc_mainへ戻る。