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_signalcannot 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_signaland 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の際に環境変数を設定した際の波形と同じですが、
効いていることがわかると思います。
「SC_SIGNAL_WRITE_CHECK」が設定されている場合は WRITER_POLICYは意味が無いようです。