Applistar

5. 2. 2 sc_module

  5. 2. 2 sc_module  

5. 2. 2 sc_module

上の形の中で使っている SC_MODULE という大文字の文字列は、実は C++ のマクロ定義です。これを展開すると、 sc_module という名前に置換えられます。 その sc_module は SystemC で予め定義されているクラスです (例えば systemc-2.0.1 などの参照実装(reference implementation) には sc_module という名前の「モジュールのためのクラス」が定義されています)。

このSC_MODULE というマクロ定義は、 予め定義された sc_module を継承した上で、 cpu という名前のクラスを新たに作っています。 つまり上に示した例は、 ユーザが「モジュール cpu のクラス定義」をする例になります。

【クラスとは ? 】 ここで言うC++ のクラスは、とても大雑把に言うと C の構造体(struct) の定義と同じようなものです。 先の例で言えば、cpu という名前の形を定義しているだけです。 そこで実際に利用するにはモジュールの配置(Instantiation) をします (これについては後述します)。

SC_MODULE のマクロ定義は、 kernel/sc_module.h つまり

http://www.iro.umontreal.ca/~chareslu/systemc-2.0.1/sc__module_8h-source.html の中の 474 行目付近で

#define SC_MODULE(user_module_name)  \
    struct user_module_name : sc_module

と定義されています。 この #define によるマクロ定義は、見てわかるとおり、 とても単純な物理的にも二行しかないものです。 このため、 上のモジュールの形の一行目に示したように

    SC_MODULE(cpu)

と書くのと、この SC_MODULE を使わないで

    struct cpu : sc_module

と書くのとは、意味としては同じになります。マクロを展開した形で見れば、全く同じです。 ここで、コロン(:) は C++ では継承を表わします。 上の例は、 「sc_module を継承して、 cpu というクラスを定義する」 という意味 になります。 また struct の文字の代りに class を使って

    class cpu : sc_module

と書くと、殆んど意味は同じです。違いは、 次に書くメンバ関数の利用可能範囲だけです。つまり、 次に指定があるまでは public でなく、private になります。 (アクセス指示子 参照)。

  5. 2. 2 sc_module