SystemC プロセスについて
プロセスとは
プロセスはプログラムが並列動作するための機構の1つ。
シミュレーションが開始されると、プロセスとして指定された関数(プロセス関数)が実行される。
プロセス関数は1つのモジュールに複数存在することも許される。
ソフトウェアの場合、プログラムは上から順に逐次実行の動作となるが、ハードウェアの場合には並列動作となるため、ピュアなCやC++ではハードウェアを表現するには難がある。並列動作を可能賭したのがSystemCであり、プロセスはSystemCの特徴の1つとなっている。
プロセスは、Verilog-HDLでいうところのinitial文やalways文に該当する。
シミュレーションが開始されると、プロセスとして指定された関数(プロセス関数)が実行される。
プロセス関数は1つのモジュールに複数存在することも許される。
ソフトウェアの場合、プログラムは上から順に逐次実行の動作となるが、ハードウェアの場合には並列動作となるため、ピュアなCやC++ではハードウェアを表現するには難がある。並列動作を可能賭したのがSystemCであり、プロセスはSystemCの特徴の1つとなっている。
プロセスは、Verilog-HDLでいうところのinitial文やalways文に該当する。
プロセスの種類
次の3つが存在する。
- SC_METHOD
- SC_THREAD
- SC_CTHREAD
それぞれマクロとなっているが、詳しい説明はしない。
SC_METHOD
Verilog-HDLのalways文に似ている。
センシティビティ・リストの記述が必要。
シミュレーション中、何度でも呼び出される。
プロセス内にwait記述することはできない。
プロセス内に無限ループを構成してはならない。
このプロセスでは機能記述することは少ない。
RTL記述の表現に使用したり、信号の受渡しのタイミング調整に使う程度。
センシティビティ・リストの記述が必要。
シミュレーション中、何度でも呼び出される。
プロセス内にwait記述することはできない。
プロセス内に無限ループを構成してはならない。
このプロセスでは機能記述することは少ない。
RTL記述の表現に使用したり、信号の受渡しのタイミング調整に使う程度。
- 構文
void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_METHOD( process_func );
- RTL組合せ回路記述例
SC_MODULE( MOD )
{
sc_in< sc_uint<8> > in_a;
sc_in< sc_uint<8> > in_b;
sc_out< sc_uint<9> > out;
SC_CTOR( MOD ) {
SC_METHOD( adder_method );
sensitive << in_a << in_b;
}
void adder_method() {
out.write( in_a.read() + in_b.read() );
}
- RTLのF/F回路生成
sc_in_clk Clk;
sc_in<bool> ResetN;
sc_in<sc_uint<8> > a;
sc_in<sc_uint<8> > b;
sc_in<sc_uint<8> > z;
SC_CTOR( MOD ) {
SC_METHOD( method0 );
sensitive << Clk.pos() << ResetN.neg();
}
void method0() {
if (!ResetN.read()) {
z.write( 0 ); // リセット記述
}
else {
z.write( a.read() + b.read() );
}
}
SC_THREAD
Verilog-HDLのinitial文に似ている。
シミュレーション開始時の1度だけ呼び出される。プロセスの実行が終了してしまうと再度呼ばれることはないため、通常はwhile(true){}を使って無限ループを構成してその中に機能記述する。
センシティビティ・リストの記述が可能。センシティビティ・リストはなくてもよい。
このプロセスを使用して機能記述することが多い。
3つのプロセスの中で、もっともアルゴリズムを記述するのに敵している。
シミュレーション開始時の1度だけ呼び出される。プロセスの実行が終了してしまうと再度呼ばれることはないため、通常はwhile(true){}を使って無限ループを構成してその中に機能記述する。
センシティビティ・リストの記述が可能。センシティビティ・リストはなくてもよい。
このプロセスを使用して機能記述することが多い。
3つのプロセスの中で、もっともアルゴリズムを記述するのに敵している。
- 構文
void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_THREAD( process_func );
- 記述例
SC_CTOR( ) { SC_THREAD( main_thread ); } void main_thread() { while (true) { // ここに機能を記述 wait( event ); } }
SC_CTHREAD
SC_THREADに似ているが、クロック動作の記述専用のTHREADである。
センシティビティ・リストは持たない。
wait記述はクロック・イベントを待つ動作となる。
reset_signal_isによりリセット動作が記述可能。
SC_THREADに比べてシミュレーション速度が遅くなる。
センシティビティ・リストは持たない。
wait記述はクロック・イベントを待つ動作となる。
reset_signal_isによりリセット動作が記述可能。
SC_THREADに比べてシミュレーション速度が遅くなる。
- 構文
sc_in_clk CLK; // クロック信号(sc_clockとつなぐ) void process_func(); // 戻り値はvoid、引数もvoid、もしくは記述しない SC_CTHREAD( process_func, clk.pos() );
- 記述例
sc_in_clk CLK; sc_in<bool> RESET_N; SC_CTOR( ) { SC_CTHREAD( main_thread, CLK.pos() ); reset_signal_is( RESET_N, false ); } void main_thread() { // ここにリセット動作を書く wait(); while (true) { // ここに機能を記述 wait(); } }