bambooflow Note

プロセス

最終更新:

Bot(ページ名リンク)

- view
メンバー限定 登録/ログイン

SystemC プロセスについて



プロセスとは

プロセスはプログラムが並列動作するための機構の1つ。
シミュレーションが開始されると、プロセスとして指定された関数(プロセス関数)が実行される。
プロセス関数は1つのモジュールに複数存在することも許される。
ソフトウェアの場合、プログラムは上から順に逐次実行の動作となるが、ハードウェアの場合には並列動作となるため、ピュアなCやC++ではハードウェアを表現するには難がある。並列動作を可能賭したのがSystemCであり、プロセスはSystemCの特徴の1つとなっている。
プロセスは、Verilog-HDLでいうところのinitial文やalways文に該当する。

プロセスの種類

次の3つが存在する。

  • SC_METHOD
  • SC_THREAD
  • SC_CTHREAD

それぞれマクロとなっているが、詳しい説明はしない。

SC_METHOD


Verilog-HDLのalways文に似ている。
センシティビティ・リストの記述が必要。
シミュレーション中、何度でも呼び出される。
プロセス内に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つのプロセスの中で、もっともアルゴリズムを記述するのに敵している。
  • 構文
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に比べてシミュレーション速度が遅くなる。
  • 構文
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();
     }
}

タグ:

SystemC プロセス
記事メニュー
ウィキ募集バナー