SystemCの thread(process) を理解しよう

SystemC Advent Calendar2012 の 18日目の記事です。
今回は、SystemCで記述する際に肝となるthread(process)の話です。
まずは、サンプルコードを見てください。


  • サンプルコード
  •  1|#include <systemc.h>
     2|
     3|SC_MODULE( hoge ){
     4|
     5|  sc_in  <bool >        clk;
     6|  sc_in  <bool >        xrst;
     7|  sc_in  <sc_uint<32> > indata1;
     8|  sc_in  <sc_uint<32> > indata2;
     9|  sc_out <sc_uint<64> > outdata_met;
    10|  sc_out <sc_uint<64> > outdata_thr;
    11|  sc_out <sc_uint<64> > outdata_cth;
    12|
    13|  void method_process();
    14|  void thread_process();
    15|  void cthread_process();
    16|
    17|  SC_CTOR( hoge ):
    18|    indata1("indata1")
    19|    , indata2("indata2")
    20|    , outdata_met("outdata_met")
    21|    , outdata_thr("outdata_thr")
    22|    , outdata_cth("outdata_cth")
    23|  {
    24|
    25|    SC_METHOD( method_process);
    26|      sensitive << clk.pos();
    27|
    28|    SC_THREAD( thread_process);
    29|      sensitive << clk.pos();
    30|
    31|    SC_CTHREAD( cthread_process, clk.pos() );
    32|      reset_signal_is(xrst, false);
    33|  }
    34|};
    35|
    36|void hoge::method_process(){
    37|  if(!xrst) {
    38|    outdata_met.write(0);
    39|  } else {
    40|    outdata_met.write(indata1.read() * indata2.read());
    41|  }
    42|}
    43|
    44|void hoge::thread_process(){
    45|  while (true) {
    46|    if(!xrst) {
    47|      outdata_thr.write(0);
    48|    } else {
    49|      outdata_thr.write(indata1.read() * indata2.read());
    50|    }
    51|    wait();
    52|  }
    53|}
    54|
    55|void hoge::cthread_process(){
    56|  outdata_cth.write(0);
    57|  wait();
    58|
    59|  while (true) {
    60|    outdata_cth.write(indata1.read() * indata2.read());
    61|    wait();
    62|  }
    63|}
  • 実行結果
    実行結果の波形はこのようになっていてすべて結果は同じです。
    つまり、書き方は違えど同じ結果になるように書けます。 20121218_simwaves.png

説明


では、細かく SystemCで定義されている3つの thread(process)を見ていきます。


SC_METHOD


  • 組み合わせ回路的なイメージ
  • プロセス関数内において、wait()を記述できない。
  • 関数コール後に再度イベント待ちになる。
    センシティビティリストに登録(ここではクロック立ち上がりエッジのみ)したイベント

SC_THREAD


  • タイミング制御が必要な回路イメージ
  • プロセス関数内において、wait()を記述できます。
  • プロセス関数から抜けると、再度呼び出されることはない。
    内部で whileやforなどで無限ループを構成することが多い。
  • 一部のツールでは高位合成対象外もある。

SC_CTHREAD


  • クロック制御が必要な回路イメージ
  • プロセス関数内において、wait()を記述できます。
  • プロセス関数から抜けると、再度呼び出されることはない。(SC_TREADと同じ)
  • リセット記述を分離出来る。
    記述を見てもらうと リセット部分が SC_CTHREADだけ違うと思います。
    記述の面でも見やすいかも。(個人差あります)

まとめ


SystemCでは 3つのプロセス関数を登録する方法があり、
それぞれの特徴を理解して記述することができます。

用途 wait コール回数
SC_METHOD 組み合わせ 不可 複数
SC_THREAD タイミング 1回
SC_CTHREAD クロック 1回

※シミュレーション開始前に一度実行されることや
 dont_initialize();については省略させていただきます。

関連記事

コメントの投稿

非公開コメント

No title

そう言えば、SC_THREADにはreset_signal_isが使えなかったですね。
むしろリセットについてはこちらの差だと思ったりします。
これ使わないと結局分離できませんし

Re: No title

> そう言えば、SC_THREADにはreset_signal_isが使えなかったですね。
> むしろリセットについてはこちらの差だと思ったりします。
> これ使わないと結局分離できませんし

コメントありがとうございます。さすがのツッコミですね。
ネタバレになってしまいますが、SystemC-2.3から使えます。
今後の記事にご期待ください!
プロフィール

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
アクセス人数