Mutex
https://www.learnsystemc.com/basic/channel_mutex
Mutexとは
- チャネルの一種であり、排他制御ロックをモデリングするためのもの。
- lockedとunlockedの2つのステートがある
- Mutexをロックできるプロセスは同時に1つまで。
- Mutexはロックされたプロセスからしかアンロックできない。アンロックされた後は別のプロセスからもロックできる。
メンバー関数
- int lock()
- unlocked状態ならMutexをロックしリターン
- locked状態ならMutexがアンロックされるまでサスペンド
- 複数のプロセスが同時(同デルタ時刻)にロックを試みた場合、どのプロセスがロックできるかは未定義
- 常に0を返す
- int trylock()
- unlocked状態ならMutexをロックし0を返す
- locked状態ならすぐに-1を返す
- int unlock()
- unlocked状態なら-1を返す
- locked状態でロックしたプロセスとは別のプロセスが呼び出した場合は-1を返す。
- locked状態でロックしたプロセスと同じプロセスが呼び出した場合はアンロックし0を返す。
- ほかのプロセスにアンロックされたことを伝達するために即時通知が使われる。
Semaphore
https://www.learnsystemc.com/basic/channel_semaphore
セマフォとは
- チャネルの一種であり、同時アクセス数が制限された状態で共有資源をアクセスできる仕組みをモデリングするためのもの
- 整数値を持つ(セマフォ値と呼ぶ)。セマフォ生成時に最大同時アクセス数を設定できる。
- 初期値1の場合、セマフォはMutexと等価である。
メンバー関数
FIFO
https://www.learnsystemc.com/basic/channel_fifo
sc_fifo
- プリミティブチャネルであり、FIFOをモデリングするために使う。
- 値を蓄えるスロットがある。スロット数はオブジェクト生成時に固定される。
- sc_fifo_in_if
, sc_fifo_out_if のインタフェースがある。
コンストラクタ
- explicit sc_fifo(int size_ = 16)
- explicit sc_fifo(const char* name_, int size_ = 16)
- sc_prim_channel(name_)
スロット数size_で初期化する。スロット数は1以上でないといけない。
メンバ関数(read)
- void read(T&), T read():
- bool nb_read(T&)
- operator T()
- "operator T() {return read();}"と等価。
メンバ関数(write)
- write(const T&)
- bool nb_write(const T&)
- operator=
- "sc_fifo
& operator= (const T& a) {write(a); return *this;}" と等価
- "sc_fifo
メンバ関数(event)
- sc_event& data_written_event()
- データ書き込みイベントを返す。FIFOにデータが書かれたデルタサイクルの最後であるデルタ通知フェーズで通知される。
- sc_event& data_read_event()
- ↑のread版
メンバ関数(有効データ、空きスロット)
- int num_available()
- 現デルタサイクルでread可能なスロット数。同デルタサイクルですでにreadされたスロット数を差し引いた値を返す(writeされたスロット数は加算されない)
- int num_free()
- 現デルタサイクルでwrite可能な空きスロット数。同デルタサイクルで既にwriteされたスロット数を差し引いた値を返す(readされたスロット数は加算されない)