Learn SystemC with Examples #8 (Primitive Channel~Customized Data Type)

Primitive Channel

https://www.learnsystemc.com/basic/primitive_channel

sc_prim_channelとは

  1. すべてのプリミティブチャネルの基底クラス
  2. updateフェーズへの固有のアクセスを提供する
  3. 階層、ポート、プロセスを含まない
  4. 階層チャネルと同様、プリミティブチャネルはinterface method call paradigmによって呼び出されるパブリックなメンバ関数を提供する。
    • request_update(): スケジューラに対してチャネルのupdate requestをキューする
    • async_request_update():
      • ↑のスレッドセーフ版。SystemCカーネル以外のOSのスレッドから呼び出される。
      • SystemCカーネルから呼び出すことは推奨されない。
    • update()
      • request_update、async_request_update呼び出しに応じて、updateフェーズ中にスケジューラによってコールバックされる。
      • アプリケーション側でこのメンバ関数をオーバーライドしてよい。sc_prim_channel での関数定義は空である。
      • 典型的には、現オブジェクトのデータメンバを読んだり更新したり、デルタ通知を作ったりする。
      • してはいけないこと
        • sc_prim_channel のメンバ関数のコール。ただし、親クラスでoverrideされたupdate関数それ自身は除く。
        • 即時通知を作るため、引数なしでsc_eventのnotify()メンバ関数を呼び出すこと
        • プロセス制御のための sc_process_handle のメンバ関数サスペンド、killなど)
        • 現オブジェクトのデータメンバを除くstorageの状態変更
        • 現オブジェクト以外のプリミティブチャネルインスタンスのread
        • チャネルインタフェース以外のメソッド呼び出し。特に、update()はsignalに対してwriteしてはならない。
    • next_trigger()
    • wait()

チャネルは一つ以上のインタフェースを実装する必要がある。つまり、インタフェースクラスを継承する必要がある。インタフェースはチャネルに必要なメソッドを提供する。

Hierarchical Channel

https://www.learnsystemc.com/basic/hierarchical_channel

階層チャネルとは

  1. sc_channel基底クラスから継承する。sc_channelはsc_moduleと全く同一である。つまり、階層チャネルとはモジュールである。
  2. なんらかのinterfaceから継承する。ポートに接続するためである。

モジュールと同様、階層チャネルはプロセスやポートを持つことができる。

この例では、sc_signal_inout_if<int>を実装したカスタム階層チャネルを示している。sc_signal_inout_ifで定義されている以下の関数を実装する必要がある。

  1. void write(const int&)
  2. const int& read() const
  3. const sc_event& value_changed_event() const
  4. const sc_event& default_event() const
  5. const int& get_data_ref() const
  6. bool event() const

補注:SystemC-3.0の場合、SC_HAS_PROCESSは削除する必要がある。

-   SC_HAS_PROCESS(SIGNAL);

Trace File

https://www.learnsystemc.com/basic/trace

  1. シミュレーション中の一連の値の変化を時間順に記録
  2. VCDファイル書式を使う
  3. sc_create_vcd_trace_fileによってのみ作成とオープンが行われる
  4. エラボレーション中もしくはシミュレーション中にオープンされる
  5. sc_trace によってトレースされている値のみ保持する
  6. 値がトレースされる前にファイルがオープンされている必要がある。ファイルが開かれてから1デルタサイクル以上経過しないと値がトレースされない
  7. sc_close_vcd_trace_file によってファイルがクローズされる。シミュレーションの最後のデルタサイクル前にクローズされるべきでない。

Error and Message Report

https://www.learnsystemc.com/basic/report

sc_report

  1. sc_report_handler::report 関数によって精されるレポートインスタンス
  2. 与えられたseverity levelとメッセージタイプにSC_CACHE_REPORTがセットされているアプリケーションが読み取れる。
  3. レポートハンドラーによって投げられたときにアプリケーションよってキャッチされることも。

sc_report_handler

  1. テキストレポートを書きだす機能を持つ。レポート生成時のアプリケーション固有のふるまいも定義できる。

sc_severityはレポートのseverity levelを表現する。

  1. enum sc_severity {SC_INFO = 0, SC_WARNING, SC_ERROR, SC_FATAL, SC_MAX_SEVERITY};
  2. 4つのレベルがあり、SC_MAX_SEVERITY は severity levelでない。

sc_verbosity は verbosity levelsを示す。sc_report_handler::set_verbosity_level() 関数や sc_report_handler::report() 関数に渡すときの引数。

  1. enum sc_verbosity {SC_NONE = 0, SC_LOW = 100, SC_MEDIUM = 200, SC_HIGH = 300, SC_FULL = 400, SC_DEBUG = 500};

sc_actions はビット単位で異なるアクションを表現する。
enum {
SC_UNSPECIFIED = 0x0000, //is not an action, serves as the default value meaning that no action has been set.
SC_DO_NOTHING = 0x0001, // is a specified action
SC_THROW = 0x0002,
SC_LOG = 0x0004,
SC_DISPLAY = 0x0008,
SC_CACHE_REPORT = 0x0010,
SC_INTERRUPT = 0x0020,
SC_STOP = 0x0040,
SC_ABORT = 0x0080
}

それぞれのseverity levelにたいしてデフォルトのアクションが関連付けられている。set_actions関数呼び出しでオーバーライド可能。デフォルトアクションは以下の通り。
#define SC_DEFAULT_INFO_ACTIONS ( SC_LOG | SC_DISPLAY )
#define SC_DEFAULT_WARNING_ACTIONS ( SC_LOG | SC_DISPLAY )
#define SC_DEFAULT_ERROR_ACTIONS ( SC_LOG | SC_CACHE_REPORT | SC_THROW )
#define SC_DEFAULT_FATAL_ACTIONS ( SC_LOG | SC_DISPLAY | SC_CACHE_REPORT | SC_ABORT )

void report(sc_severity, const char* msg_type, const char* msg, [int verbosity], const char* file, int line)
関数は、レポートを生成し、適したアクションを起こす。

  1. 1つめの引数で渡されたseverity、2つ目の引数で渡されたメッセージタイプを使って、アクションを決定する。以前呼び出されたset_actions, stop_after, suppress, forceにも基づく。
  2. 5つすべての引数を使って sc_report オブジェクトを作り、set_handlerによって設定されたハンドラーにそのオブジェクトを渡す。
  3. report関数を呼び出した以降はオブジェクトは保持されない。ただし、アクションに SC_CACHE_REPORT が設定されている場合は get_cached_reports 関数によってオブジェクトを再び取得できる。
  4. report()関数では実行されるアクションの決定を担う。set_handler関数によって設定されるハンドラー関数はそのアクションの実行を担う。
  5. 生成されたレポート数を管理する。このカウント数はアクションが実行されようが抑制されようがインクリメントされる。ただし、verbosity levelによってレポートが無視された場合は除く。

set_actions():

  1. report()メンバ関数によってとられるアクションの設定。
  2. 以前呼び出したseverity, メッセージタイプ、あるいはその組み合わせと同じ場合はアクションを上書きする。

stop_after():

  1. 引数で与えられた制限数にレポート数が到達するとsc_stop()を呼び出す。

get_count():

  1. レポート数を返す

Verbosity level:

  1. int set_verbosity_level(int): 最大verbosity levelの設定。
  2. int get_verbosity_level(): 最大verbosity levelを返す。

Customized Data Type

https://www.learnsystemc.com/basic/customized_datatype

sc_signal<T> と sc_fifo<T> は様々なデータタイプが使用できる。SystemCの組み込み型はすでに対応済みである。
カスタムデータタイプを使うには、以下のメンバ関数を実装する必要がある。

  1. operator=(): read/writeメソッドに必要
  2. operator==(): sc_signal::value_changed_event() に必要
  3. ostream& operator<<(): 出力に必要
  4. sc_trace(): SystemCのトレース機構への組み込みに必要。波形ビューアでも見れるようになる。