Learn SystemC with Examples #5 (Mutex~FIFO)

Mutex

https://www.learnsystemc.com/basic/channel_mutex

Mutexとは

  1. チャネルの一種であり、排他制御ロックをモデリングするためのもの。
  2. lockedとunlockedの2つのステートがある
    • Mutexをロックできるプロセスは同時に1つまで。
    • Mutexはロックされたプロセスからしかアンロックできない。アンロックされた後は別のプロセスからもロックできる。

メンバー関数

  1. int lock()
    • unlocked状態ならMutexをロックしリターン
    • locked状態ならMutexがアンロックされるまでサスペンド
    • 複数のプロセスが同時(同デルタ時刻)にロックを試みた場合、どのプロセスがロックできるかは未定義
    • 常に0を返す
  2. int trylock()
    • unlocked状態ならMutexをロックし0を返す
    • locked状態ならすぐに-1を返す
  3. int unlock()
    • unlocked状態なら-1を返す
    • locked状態でロックしたプロセスとは別のプロセスが呼び出した場合は-1を返す。
    • locked状態でロックしたプロセスと同じプロセスが呼び出した場合はアンロックし0を返す。
      • ほかのプロセスにアンロックされたことを伝達するために即時通知が使われる。

Semaphore

https://www.learnsystemc.com/basic/channel_semaphore

セマフォとは

  1. チャネルの一種であり、同時アクセス数が制限された状態で共有資源をアクセスできる仕組みをモデリングするためのもの
  2. 整数値を持つ(セマフォ値と呼ぶ)。セマフォ生成時に最大同時アクセス数を設定できる。
    • 初期値1の場合、セマフォはMutexと等価である。

メンバー関数

  1. int wait()
  2. int trywait()
  3. int post()
    • セマフォ値をインクリメントする
    • 待ちプロセスに対してセマフォ値がインクリメントされたことを伝達するため即時通知を使う
    • 常に0を返す
  4. int get_value()

FIFO

https://www.learnsystemc.com/basic/channel_fifo

sc_fifo

  1. プリミティブチャネルであり、FIFOモデリングするために使う。
  2. 値を蓄えるスロットがある。スロット数はオブジェクト生成時に固定される。
  3. sc_fifo_in_if, sc_fifo_out_ifのインタフェースがある。

コンストラク

  1. explicit sc_fifo(int size_ = 16)
    • 基底クラスのコンストラクタを以下のようにイニシャライザリストから呼び出す。
      • sc_prim_channel(sc_gen_unique_name( "fifo" ))
  2. explicit sc_fifo(const char* name_, int size_ = 16)
    • sc_prim_channel(name_)

スロット数size_で初期化する。スロット数は1以上でないといけない。

メンバ関数(read)

  1. void read(T&), T read():
    • FIFOからデータを取り出す(取り出したデータはFIFOから削除)
    • read順はwrite順と完全一致する
    • 現デルタ時刻に書き込まれたデータは読みだせない。読み出せるのは次デルタ時刻から
    • FIFOが空ならサスペンドする
  2. bool nb_read(T&)
    • 基本的にはreadと同じだが、FIFOが空の場合、サスペンドせずにすぐさまfalseを返す。FIFOが空でなければtrueを返す。
  3. operator T()
    • "operator T() {return read();}"と等価。

メンバ関数(write)

  1. write(const T&)
    • FIFOにデータを書き込む
    • 同一デルタ時刻に複数のデータが書き込まれることもありうる
    • 同一デルタ時刻にリードされて空きスロットが出たとしても、その空きスロットに書き込まれるようになるのは次のデルタ時刻から。
    • FIFOがFullならサスペンドする
  2. bool nb_write(const T&)
    • 基本的には write() と同じだが、FIFOがフルの時はサスペンドせずにすぐさまfalseを返す。フルでないときはtrueを返す。
  3. operator=
    • "sc_fifo& operator= (const T& a) {write(a); return *this;}" と等価

メンバ関数(event)

  1. sc_event& data_written_event()
    • データ書き込みイベントを返す。FIFOにデータが書かれたデルタサイクルの最後であるデルタ通知フェーズで通知される。
  2. sc_event& data_read_event()
    • ↑のread版

メンバ関数(有効データ、空きスロット)

  1. int num_available()
    • 現デルタサイクルでread可能なスロット数。同デルタサイクルですでにreadされたスロット数を差し引いた値を返す(writeされたスロット数は加算されない)
  2. int num_free()
    • 現デルタサイクルでwrite可能な空きスロット数。同デルタサイクルで既にwriteされたスロット数を差し引いた値を返す(readされたスロット数は加算されない)