Applistar

5. 10 モジュールの配置(instance)

TOP > 5 SystemC入門 > 5. 10 モジュールの配置(instance)
  5. 10 モジュールの配置(instance)  

5. 10 モジュールの配置(instance)

SC_MOLUDE の項でも説明しましたが、 モジュールを定義する、というのはクラス、 簡単に言えば型を定義しているだけです。 そこでそれを実際に利用するには、配置をします。 通常「インスタンスを作る」「インスタンスする」とか言いますが、 日本語の「配置」の方が分りやすいので、その用語も使います。

SystemC のモジュールは C++ のクラスを使って表現しています。 従って、SystemC のモジュールの配置は、 「C++ でクラスを配置してオブジェクトを作る(instantiation)」 のと同じ方法・ルールに従います。

C++ と SystemC に共通のことですが、 その配置の方法には二通り あります。以下の例では、「モジュール名」の中に「下位モジュールクラス」を配置 する場合を考えています。

5. 10. 1 ポインタ指定による下位モジュールの配置(方法 1)

SC_MODULE(モジュール名)
   下位モジュールクラス *配置ポインタ名;
   SC_CTOR(モジュール名) {
     配置ポインタ名 = new 下位モジュールクラス("インスタンス名") ;  // 配置 .. (参照 1)
     配置ポインタ名 -> ポート名(チャネル名)          ;  // チャネル・ポート接続.. (参照 2)
   }

この方法で配置した場合には、 上にあるようにチャネルとポートを接続するのに -> を使います。 上の中では(チャネル名)という記述がありますが、これは上位側の接続点の名前、 例えば「モジュール名」モジュールの中の信号名などを書きます。

この方法では配置ポインタが public で参照出来ますので、 上位のモジュールから内部を見ることも可能で、例えば内部の信号の波形を 調べたり出来ます。

5. 10. 2 型名(クラス名)による下位モジュールの配置(方法 2)

SC_MODULE(モジュール名)

   SC_CTOR(モジュール名) {
   下位モジュールクラス  インスタンス名("インスタンス名")         ; // 配置.. (参照 3)
   インスタンス名 . ポート名(チャネル名)              ; // チャネル・ポート接続.. (参照 4)
  }

この方法で配置した場合には、 チャネルとポートはピリオド(.) を使って接続します。

この方法は記述はすっきりしていのですが、 コンストラクタ(SC_CTOR 以下)にモジュールを配置するため、 上位モジュールから下位のモジュールの中を見ることが出来ません。 このため、内部信号を調べることが出来ません。

また、内部にモジュールを配置する場合には、その初期化リスト を書いておきます。

(参照 1)(参照 3) と書いてある行のように、 この中で、 ( ) の中に "インスタンス名" と書くのは SystemC 特有の約束事です。 またポートとチャネルの接続をその配置のすぐ後に書く方法 を推奨します(参照 2, 4)

5. 10. 3 前項の方法 1 と方法 のどちらを使うか (インスタンスの記述位置)

モジュールを配置するのは、sc_main() の中か、 (上位)モジュール定義の中のコンストラクタの中です。 sc_main に置く時には、方法 2を、それ以外は 方法 1 を使うことを 推奨します。

5. 10. 4 sc_main

階層のないモジュールを一つだけ試すなら、sc_main() に置きます。 あるいは、sc_main() はテストべンチを含む全体となることもあります。 その時には、テストべンチと、被テストモジュール ( module under test) を sc_main()に置きます。

5. 10. 5 階層モジュール

モジュールを階層的に構成していく時には、下位のモジュールをコンストラクタ に配置します。

box という名前のモジュールを fox というモジュールの中に二つ置く という非常に簡単な例を示します

{{inc_dir("mef/simple")}} {{incex2(simple.h)}} {{incex2(simple.cpp)}}

  5. 10 モジュールの配置(instance)  
TOP > 5 SystemC入門 > 5. 10 モジュールの配置(instance)