5. 7. 3 単純チャネル(primitive channel)
単純チャネル(primitive channel) は 内部にプロセスを持たないチャネルです。SystemC ではあらかじめ、いくつかの単純チャネルが用意されていますが、 自分で新たに定義することも出来ます。
単純チャネル(primitive channel) は 内部にプロセスを持たないチャネルです。SystemC ではあらかじめ、いくつかの単純チャネルが用意されていますが、 自分で新たに定義することも出来ます。
単純チャネルは sc_prim_channel を継承して作ります。その sc_prim_channel には、 request_update()/update() という二つの関数が定義されていて、 これらはシミュレーションで重要な役割を果します。
シミュレーションの仕組みを考える時には、 デルタサイクルという考え方が出て来ます。これは、 計算機のプログラムは 「時系列で動くもので、ある時点では、たった一つの動作しかしていない」 という機能を持っています。 このしくみを使って、 「並行動作をする世界をシミュレーションする」時の常套手段です。 「値の評価」と「値の更新」を別々に行なう、とも言えます。良くある例えが、 二つの変数の値の交換(入替え)です。
通常のプログラミング言語では、二つの値を入替えるには、 もう一つ別の仮の変数の手助けが必要です。
swap (a, b) {
int t;
t = a;
a = b;
b = t;
}
しかし SystemC では、その必要がありません。
sc_prim_channel というクラスは、 単純チャネル()を作る時に継承されるものです。 これは 抽象基底クラス()の形をしています。 下の図を見ると、次のような単純チャネルが用意されていることが分ります。
| sc_fifo |
| sc_mutex |
| sc_semaphore |
| sc_signal |
| sc_buffer |
| sc_signal_resolved |
| sc_signal_rv |
http://www.iro.umontreal.ca/~lablasso/DocSystemC2.0.1/classsc__prim__channel.html

sc_signal は sc_signal_inout_if インタフェースを実装するチャネルの一つです。 この型の変数を使うと、 信号線のように考えて記述することが出来ます。 VHDL の signal とも良く似ています。
sc_signal 型の信号は一つのプロセスからだけ書く(代入する)ことが出来ます。
sc_signal のDoxyGen 形式は次のところにあります
http://www.iro.umontreal.ca/~lablasso/DocSystemC2.0.1/classsc__signal.html
class sc_signal_resolved : public sc_signal<sc_logic>
前項の sc_signal<sc_logic> は、一つのプロセスからしか書くことが出来ません。 sc_signal_resolved は、それを複数のプロセスから書けるようにしたチャネルです。 これは、インタフェース sc_signal_inout_if を実装するものの一つです。
DoxyGen の形式は次のところにあります。
http://www.iro.umontreal.ca/~lablasso/DocSystemC2.0.1/classsc__signal__resolved.html
ここで出て来た sc_logic は信号の型のためのクラスで、次のような値をとることが出来ます。
| 型 | 値 | |||
|---|---|---|---|---|
| sc_logic_value_t | Log_0 | Log_1 | Log_Z | LogX |
| bool | false | true | n/a | n/a |
| int | 0 | 1 | n/a | n/a |
| char | '0' | '1' | 'Z' | 'X' |
参照:
http://www.iro.umontreal.ca/~lablasso/DocSystemC2.0.1/classsc__dt_1_1sc__logic.html
前項の sc_signal_resolved は幅のないチャネルですが、 sc_signal_rv はそれに幅のついたチャネルです。
template <int W>
class sc_signal_rv : public sc_signal<sc_lv<W> >
{
...
同様にして、ここで参照されている sc_lv は sc_logic に幅のついた型のクラスです。