SystemC 2.3変更点(WRITER_POLICY)

SystemC Advent Calendar2012 の 22日目の記事です。


今回は SystemC-2.3から追加された WRITER_POLICYについてです。

SystemC-2.2では


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

  • サンプルコード
  •  1|#include <systemc.h>
     2|
     3|SC_MODULE( hoge ){
     4|
     5|  sc_in  <bool >        xrst;
     6|  sc_in  <bool >        set_p;
     7|  sc_in  <sc_uint<32> > setdata;
     8|  sc_in  <bool >        clr_p;
     9|  sc_out <sc_uint<32> > outdata;
    10|
    11|  void m_set_process();
    12|  void m_clr_process();
    13|  void m_out_process();
    14|
    15|  sc_signal<bool> _flag;
    16|
    17|  SC_CTOR( hoge ):
    18|    xrst("xrst")
    19|    , set_p("set_p")
    20|    , setdata("setdata")
    21|    , clr_p("clr_p")
    22|    , outdata("outdata")
    23|  {
    24|    _flag = 0;
    25|
    26|    SC_METHOD( m_set_process);
    27|      sensitive << set_p.pos();
    28|      dont_initialize();
    29|
    30|    SC_METHOD( m_clr_process);
    31|      sensitive << xrst.neg();
    32|      sensitive << clr_p.pos();
    33|      dont_initialize();
    34|
    35|    SC_METHOD( m_out_process);
    36|      sensitive << _flag;
    37|      dont_initialize();
    38|  }
    39|};
    40|
    41|void hoge::m_set_process(){
    42|    _flag = 1;
    43|}
    44|
    45|void hoge::m_clr_process(){
    46|    _flag = 0;
    47|}
    48|
    49|void hoge::m_out_process(){
    50|  if(_flag) {
    51|    outdata.write(setdata.read());
    52|  } else {
    53|    outdata.write(0);
    54|  }
    55|}
  • 実行結果(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 が追加されました。

    • WRITER_POLICYの型
    enum sc_writer_policy {
        SC_ONE_WRITER,   // default
        SC_MANY_WRITERS
    };
    • サンプルコード
    •  1|#include <systemc.h>
       2|
       3|SC_MODULE( hoge ){
       4|
       5|  sc_in  <bool >        xrst;
       6|  sc_in  <bool >        set_p;
       7|  sc_in  <sc_uint<32> > setdata;
       8|  sc_in  <bool >        clr_p;
       9|  sc_out <sc_uint<32> > outdata;
      10|
      11|  void m_set_process();
      12|  void m_clr_process();
      13|  void m_out_process();
      14|
      15|  sc_signal<bool, SC_MANY_WRITERS> _flag;
      16|
      17|  SC_CTOR( hoge ):
      18|    xrst("xrst")
      19|    , set_p("set_p")
      20|    , setdata("setdata")
      21|    , clr_p("clr_p")
      22|    , outdata("outdata")
      23|  {
      24|    _flag = 0;
      25|
      26|    SC_METHOD( m_set_process);
      27|      sensitive << set_p.pos();
      28|      dont_initialize();
      29|
      30|    SC_METHOD( m_clr_process);
      31|      sensitive << xrst.neg();
      32|      sensitive << clr_p.pos();
      33|      dont_initialize();
      34|
      35|    SC_METHOD( m_out_process);
      36|      sensitive << _flag;
      37|      dont_initialize();
      38|  }
      39|};
      40|
      41|void hoge::m_set_process(){
      42|    _flag = 1;
      43|}
      44|
      45|void hoge::m_clr_process(){
      46|    _flag = 0;
      47|}
      48|
      49|void hoge::m_out_process(){
      50|  if(_flag) {
      51|    outdata.write(setdata.read());
      52|  } else {
      53|    outdata.write(0);
      54|  }
      55|}
    • 実行結果
      こちらの波形になります。
      SystemC-2.2の際に環境変数を設定した際の波形と同じですが、
      効いていることがわかると思います。
      20121222_waves.png

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

    関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数