Applistar

5. 6 ポート

TOP > 5 SystemC入門 > 5. 6 ポート
  5. 6 ポート  

5. 6. 1 sc_in などの実際例

例えば上の一行目の次の記述に注目します。

  sc_in<bool>  reset;

この行では、 sc_in という型のオブジェクトがあって、その名前を reset だとしています。 そうして、 それは bool 型の 入力信号インタフェース (sc_signal_in_if,前項参照) とつながると 宣言している、と読めます。sc_in の継承関係は次のようになっています。

さらに上記例の次の行で、 また同じく clk という入力、 int 型の信号出力 cpu_out があると宣言しています。

  sc_in<bool>  clk;
  sc_out<int>  cpu_out;

これらの sc_in, sc_out は、ポートとしては簡単なものの例です。

5. 6. 2 sc_port

さて、 システムを分割して設計する時には、分割されたモジュールの 接続方法、あるいは接続の方式が重要です。 これらを予め 決めて、 それらをはっきり宣言しておく必要があります。 SystemC のポ一トは、 モジュールが外界と接続し通信する手段として、 そのような目的に使えるように用意されているものです。 クラスで言えば sc_port になります。その sc_port の DoxyGen 情報は次のところにあります:

http://www.iro.umontreal.ca/~chareslu/systemc-2.0.1/classsc__port.html

また sc_port の継承関係図は次の通りです。

最初の例に示したように 既に用意されているポートのクラスとして sc_in, sc_out などが あります。これらは、構造記述とも言い signal (信号線)を使った 接続を表現するために用意されているものです。

これらの sc_in, sc_out ばかりでなく、 ユーザが新たにポートのクラスを作ることも出来ます。 いづれにしても、 ポートを宣言する時には、それに対応するインタフェースを指定する必要 があります。

ポート用のクラス sc_port の定義は、次のような 次のようなテンプレートクラスになっています。

template<class IF, int N=1>
class sc_port : ...
{
public:
        IF* operator ->();
       ...
}

ここに示したものは http://www.iro.umontreal.ca/~chareslu/systemc-2.0.1/sc__port_8h-source.html に書かかれているのですが、そこでは、 実際には、もう少しこみ入った記述になっています。

この < > の中がテンプレートクラスの引数です。

sc_port はこのような定義になっていますが、これを 継承してつくったポートを使う時には、 インタフェース(IF)と、数(N)を指定します。

上で定義されている

->()

という演算子はとても重要です。 例えば、次のようにして p という名前のポートを作ったとします。

  sc_port<sc_signal_inout_if<int> > p;

すると、このsc_signal_inout_if というインタフェースには

  • read(), write()というメンバ関数が宣言されている
  • 演算子->はポートがつながれているインタフェースへのポインタを返す
  • チャネル(sc_signal)にはread(), write()の実装が定義されている

ために、p->read() や p->write() と書くと、 ポート p につながれたチャネルの read() インタフェース や write() インタフェースが呼ばれ、 読書きをすることが出来ます。

5. 6. 3 sc_in, sc_out

sc_in, sc_out はポートの中でも単純なものです。

sc_in の DoxyGen 形式は次のところにあります。 http://www.iro.umontreal.ca/~chareslu/systemc-2.0.1/classsc__in.html

5. 6. 4 その他の既定義のポート

systemc-2.0.1 には、その他にもいくつかのチャネル用に次のようなポートが用意されています。

sc_buffer, sc_signal用
sc_in
sc_inout
sc_out
sc_fifo用
sc_fifo_in
sc_fifo_out
sc_signal_resolved用

sc_signal_resolved は複数のプロセスから書けるチャネルです。 そのようなチャネルに接続するためのポートが次のように用意されています。

sc_in_resolved
sc_inout_resolved
sc_out_resolved
sc_signal_rv用

sc_signal_rv は複数のプロセスから書け、幅も指定出来るチャネルです。 そのチャネルに接続するためのポートは次のようなものです。

  5. 6 ポート  
TOP > 5 SystemC入門 > 5. 6 ポート