SystemC:name()関数使ってますか?

SystemCを構成しているライブラリには、name()関数が存在します。
name()関数は色々な場面で使えると思います。

モジュールや信号のインスタンスを取得する。

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

SC_MODULE (hoge) {
  sc_in<bool>         clock;
  sc_in<bool>         reset;
  sc_in<sc_uint<8> >  indata;
  sc_out<sc_uint<8> > outdata;

  void process() {
    outdata.write(0);
    wait();

    while (true) {
      wait();
      printf("Instance Name:%s\n", name());
      printf("Port(clock  ) Name:%s\n", clock.name());
      printf("Port(reset  ) Name:%s\n", reset.name());
      printf("Port(indata ) Name:%s\n", indata.name());
      printf("Port(outdata) Name:%s\n", outdata.name());
    }
  }

  SC_CTOR(hoge)
  {
    SC_CTHREAD(process,clock.pos());
      reset_signal_is(reset, false);
  }
}; 

int sc_main (int argc, char* argv[]) {
  sc_clock clock ("clock",1,SC_NS);
  sc_signal<bool>        reset;
  sc_signal<sc_uint<8> > indata;
  sc_signal<sc_uint<8> > outdata;

  hoge uhoge("uhoge");
  uhoge.clock(clock);
  uhoge.reset  (reset  );
  uhoge.indata (indata );
  uhoge.outdata(outdata);

  reset = 1;
  indata = 10;
  sc_start(3, SC_NS);

  return 0;
}
  • 実行結果
Instance Name:uhoge
Port(clock  ) Name:uhoge.port_0
Port(reset  ) Name:uhoge.port_1
Port(indata ) Name:uhoge.port_2
Port(outdata) Name:uhoge.port_3

パラメータを取得する。

モジュール自身でTOP階層からどのようにインスタンスされているか確認することができます。
この name()関数と 以前紹介した sc_argv を利用することで、 一つのパラメータファイルから自分自身のパラメータのみ抽出し反映させることができます。
今回は手順のみ紹介します。

  1. パラメータファイルを用意 (例えば、top.uhoge.size = 10)
  2. モジュール内部で、sc_argv()利用しパラメータファイルを読み込む
  3. ファイル読み込み時に name()+パラメータのパターンマッチを行う
  4. パターンマッチした場合は 値を代入する

といった感じで、外部ファイルから自分自身のパラメータを取得するような方法もできます。

次回予告

今回、name()関数を紹介し、インスタンス名や信号名を取得することができます。
しかし、信号名に関しては Port_x(x:番号)になっていたと思います。
これを解決する手段を紹介します。