SC_MODULEとclass xxx : sc_module の違いについて

SystemCのモジュールを記述する際の
SC_MODULEとclass xxx : sc_module の違いについてです。

C++の「struct」と「class」を理解することでわかると思います。
まずは、こちらのソースから。
#include <stdio.h>

struct hoge {
  int a;
  inline void show(){
    printf("[struct] data a = %d\n", a);
  };
};

int main(int argc, char const* argv[]) {
  hoge test;
  test.a = 10;
  test.show();
  return 0;
}
実行結果はこちらになります。
20120518_struct.png

ここで、hogeというのを「struct(構造体)」で宣言しました。
次に、「class」で宣言してみます。
class hoge {
  int a;
  inline void show(){
    printf("[class]  data a = %d\n", a);
  };
};
上記の記述では、コンパイルすると以下のようなErrorが発生します。
20120518_comp_error.png

なので、「public」を指定します。
class hoge {
public:
  int a;
  inline void show(){
    printf("[class]  data a = %d\n", a);
  };
};
とすると、コンパイルエラーがなくなり実行できます。
20120518_class.png

では、SystemCコードではどうでしょうか?
#include <systemc>
using namespace sc_core;

SC_MODULE(Top) {
  SC_CTOR(Top)
  {
    SC_THREAD(T);
    f = 0;
  }
  
  int f;
  void T(){
     //処理
  }
  
};

int sc_main(int argc, char* argv[])
{
  Top top("top");
  sc_start();

  top.f = 10;
  printf("top.f = %d\n", top.f);
  return 0;
}
これをコンパイルしてもエラーなく実行できます。
実行結果がこちらです。
20120518_systemc.png

ということで、SystemCのライブラリを見てみると、SC_MODULEは「struct」で定義されています。
#define SC_MODULE(user_module_name) \
struct user_module_name : ::sc_core::sc_module
なので、module内のメンバ変数/関数は外部から呼ぶことが可能です。
一方の「class xxx : sc_module」のほうは、C++定義より defaultだと、
「外部アクセス不可(private)」なので任意に「public」を指定をする必要があります。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
05 | 2017/06 | 07
- - - - 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 -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数