SystemC 2.3変更点([async_]reset_signal_is)

前回までで、SystemCの thread(process)について語ってきました。
特に SC_CTHREADに対して細かく語ってきたのですが、SystemC-2.3の変更点を 見ていくと面白いことがわかります。
今回の記事はそのような内容になってます。

async_reset_signal_is の追加

SystemC-2.2では「reset_signal_is」というメンバ関数が存在していました。
このメンバ関数は

  • 同期リセット
  • 「SC_CTHREAD」のみ適用

SC_CTHREAD以外で宣言すると実行時に以下のようなエラーになります。

Error: (E567) reset_signal_is() is only allowed for SC_CTHREADs
In file: ../../../../src/sysc/kernel/sc_reset.cpp:186

今回追加された「async_reset_signal_is」は

  • 非同期リセット
  • SC_METHOD, SC_THREADでも使用可能

となってます。

  • サンプルコード
#include <systemc.h>

SC_MODULE( hoge ){

  sc_in  <bool >        clk;
  sc_in  <bool >        xrst;
  sc_in  <sc_uint<32> > indata1;
  sc_in  <sc_uint<32> > indata2;
  sc_out <sc_uint<64> > outdata_met;
  sc_out <sc_uint<64> > outdata_thr;
  sc_out <sc_uint<64> > outdata_cth;

  void method_process();
  void thread_process();
  void cthread_process();

  SC_CTOR( hoge ):
    indata1("indata1")
    , indata2("indata2")
    , outdata_met("outdata_met")
    , outdata_thr("outdata_thr")
    , outdata_cth("outdata_cth")
  {

    SC_METHOD( method_process);
      sensitive << clk.pos();
      async_reset_signal_is(xrst, false);

    SC_THREAD( thread_process);
      sensitive << clk.pos();
      async_reset_signal_is(xrst, false);

    SC_CTHREAD( cthread_process, clk.pos() );
      async_reset_signal_is(xrst, false);
  }
};

void hoge::method_process(){
  if(!xrst) {
    outdata_met.write(0);
  } else {
    outdata_met.write(indata1.read() * indata2.read());
  }
}

void hoge::thread_process(){
  while (true) {
    if(!xrst) {
      outdata_thr.write(0);
    } else {
      outdata_thr.write(indata1.read() * indata2.read());
    }
    wait();
  }
}

void hoge::cthread_process(){
  outdata_cth.write(0);
  wait();

  while (true) {
    outdata_cth.write(indata1.read() * indata2.read());
    wait();
  }
}
  • 実行結果

f:id:kocha2012:20121221002658p:plain

このようになります。

reset_signal_isの拡張

SystemC-2.3より、SC_METHOD や SC_THREADに対しても「reset_signal_is」が使えます。 つまり、先程のコードから SC_THREADを SC_CTHREADのように記述することができます。

  • SC_THREADのプロセス内部記述を変更
void hoge::thread_process(){
  outdata_thr.write(0);
  wait();

  while (true) {
    outdata_thr.write(indata1.read() * indata2.read());
    wait();
  }
}

これでも先ほどまでと同じ非同期リセットが有効になりますので、
動作させると、同じ波形になります。

  • 「reset_signal_is」に変更
    SC_THREADでも使えます。
    SC_THREAD( thread_process);
      sensitive << clk.pos();
      reset_signal_is(xrst, false);

実行した結果がこちらになります。

f:id:kocha2012:20121221002724p:plain

意図した通りに動作していることがわかると思います。
前回(SC_CTHREADを活かすためにsc_signalに拡張を試みた話)トライしていたわたしは一体。。。 ということは、SC_CTHREAD要らないのでは\(^o^)/

リセット部分と動作部分を分けて書くことが出来るので、
この書き方が推奨されるようになるといいなと思います。