SystemC 2.3 : sc_vector

SystemC-2.3(IEEE1666-2011)から追加された「sc_vector」を書いてみました。
sc_vector は、モジュールや信号について記述することができます。

ポート信号に対して

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

SC_MODULE( hoge ){

  sc_vector<sc_in<bool> > in;

  void m_process();

  SC_CTOR( hoge ):
    in("in", 4)
  {
    SC_METHOD( m_process);
      sensitive << in[0] << in[1] << in[2] << in[3];
      dont_initialize();
  }
};

void hoge::m_process(){
  for(unsigned int i=0; i < in.size(); i++) {
    bool tmp = in[i].read();
    printf("in[%d] = %d\n", i, tmp);
  }
}

int sc_main(int argc, char* argv[])
{
  sc_vector<sc_signal<bool> > signals;
  signals.init(4); // [3:0]

  hoge mhoge("mhoge");
  mhoge.in.bind(signals);

  for(unsigned int i=0; i < signals.size(); i++) {
    signals[i] = i & 0x1;
  }
  sc_start(1, SC_NS);

  return 0;
}
  • 実行結果
             SystemC 2.3.0-ASI --- Dec 14 2012 21:01:01
        Copyright (c) 1996-2012 by all Contributors,
        ALL RIGHTS RESERVED

in[0] = 0
in[1] = 1
in[2] = 0
in[3] = 1

モジュールに対して

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

SC_MODULE( hoge ){

  sc_in<bool> in;

  void m_process();

  SC_CTOR( hoge ):
    in("in")
  {
    SC_METHOD( m_process);
      sensitive << in;
      dont_initialize();
  }
};

void hoge::m_process(){
  bool tmp = in.read();
  printf("%s.in = %d\n", name(), tmp);
}

int sc_main(int argc, char* argv[])
{
  sc_vector<sc_signal<bool> > signals;
  signals.init(4); // [3:0]

  sc_vector<hoge> mhoge("mhoge", 4);
  // bind
  for(unsigned int i=0; i < signals.size(); i++) {
    mhoge[i].in.bind(signals[i]);
  }

  for(unsigned int i=0; i < signals.size(); i++) {
    signals[i] = i & 0x1;
  }
  sc_start(1, SC_NS);

  return 0;
}
  • 実行結果
             SystemC 2.3.0-ASI --- Dec 14 2012 21:01:01
        Copyright (c) 1996-2012 by all Contributors,
        ALL RIGHTS RESERVED

mhoge_1.in = 1
mhoge_3.in = 1

ここでは、mhoge_2/4は 0(値が変化していない)ために、表示されません。

センシティビティリストへの登録が面倒っぽいけどどうにかならないのかな???