SystemC 2.3変更点(WRITER_POLICY)

SystemC-2.3から追加された WRITER_POLICYについて

SystemC-2.2では

SystemC-2.2では、sc_signalに対して複数のプロセスから アクセスするような記述があるとエラーになってました。

#include <systemc.h>

SC_MODULE( hoge ){

  sc_in  <bool >        xrst;
  sc_in  <bool >        set_p;
  sc_in  <sc_uint<32> > setdata;
  sc_in  <bool >        clr_p;
  sc_out <sc_uint<32> > outdata;

  void m_set_process();
  void m_clr_process();
  void m_out_process();

  sc_signal<bool> _flag;

  SC_CTOR( hoge ):
    xrst("xrst")
    , set_p("set_p")
    , setdata("setdata")
    , clr_p("clr_p")
    , outdata("outdata")
  {
    _flag = 0;

    SC_METHOD( m_set_process);
      sensitive << set_p.pos();
      dont_initialize();

    SC_METHOD( m_clr_process);
      sensitive << xrst.neg();
      sensitive << clr_p.pos();
      dont_initialize();

    SC_METHOD( m_out_process);
      sensitive << _flag;
      dont_initialize();
  }
};

void hoge::m_set_process(){
    _flag = 1;
}

void hoge::m_clr_process(){
    _flag = 0;
}

void hoge::m_out_process(){
  if(_flag) {
    outdata.write(setdata.read());
  } else {
    outdata.write(0);
  }
}
  • 実行結果(NG)
$> ./main
             SystemC 2.2.0 --- Mar 28 2011 14:51:38
        Copyright (c) 1996-2006 by all Contributors
                    ALL RIGHTS RESERVED
WARNING: Default time step is used for VCD tracing.

Error: (E115) sc_signal cannot have more than one driver:
 signal `mhoge.signal_0' (sc_signal)
 first driver `mhoge.m_set_process' (sc_method_process)
 second driver `mhoge.m_clr_process' (sc_method_process)
In file: ../../../../src/sysc/communication/sc_signal.cpp:137

しかし、このエラーは環境変数の設定で回避できます。
例) cshの場合

setenv SC_SIGNAL_WRITE_CHECK DISABLE

SystemC-2.3の場合

「SC_SIGNAL_WRITE_CHECK」は SystemC-2.3でも有効ですが、
追加された WRITER_POLICYを使って明確に記述したほうがよいと思います。

  • IEEE1666-2011より
6.5 sc_signal and sc_signal

ということで、sc_signal<bool> と sc_signal<sc_logic>に対して、WRITER_POLICY が追加されました。

enum sc_writer_policy {
    SC_ONE_WRITER, // default
    SC_MANY_WRITERS
};
  • サンプルコード
#include <systemc.h>

SC_MODULE( hoge ){

  sc_in  <bool >        xrst;
  sc_in  <bool >        set_p;
  sc_in  <sc_uint<32> > setdata;
  sc_in  <bool >        clr_p;
  sc_out <sc_uint<32> > outdata;

  void m_set_process();
  void m_clr_process();
  void m_out_process();

  sc_signal<bool, SC_MANY_WRITERS> _flag;

  SC_CTOR( hoge ):
    xrst("xrst")
    , set_p("set_p")
    , setdata("setdata")
    , clr_p("clr_p")
    , outdata("outdata")
  {
    _flag = 0;

    SC_METHOD( m_set_process);
      sensitive << set_p.pos();
      dont_initialize();

    SC_METHOD( m_clr_process);
      sensitive << xrst.neg();
      sensitive << clr_p.pos();
      dont_initialize();

    SC_METHOD( m_out_process);
      sensitive << _flag;
      dont_initialize();
  }
};

void hoge::m_set_process(){
    _flag = 1;
}

void hoge::m_clr_process(){
    _flag = 0;
}

void hoge::m_out_process(){
  if(_flag) {
    outdata.write(setdata.read());
  } else {
    outdata.write(0);
  }
}
  • 実行結果
    こちらの波形になります。
    SystemC-2.2の際に環境変数を設定した際の波形と同じですが、
    効いていることがわかると思います。

f:id:kocha2012:20121222002232p:plain

「SC_SIGNAL_WRITE_CHECK」が設定されている場合は WRITER_POLICYは意味が無いようです。