Learn SystemC with Examples #2 (Simulation Process~Concurrency)

Simulation Process

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

シミュレーションプロセスとは

  1. sc_moduleクラスのメンバー関数であり
  2. 引数がなく戻り値もなく
  3. シミュレーションカーネルにより登録されるものである。

シミュレーションプロセスを登録するには以下の3つの方法がある。

  1. SC_METHOD(func)
    • 自身の実行スレッドがない
    • シミュレーション時間を消費しない
    • サスペンドできない
    • wait()関数を呼び出している関数を呼び出せない
  2. SC_THREAD(func)
    • 自身の実行スレッドがある
    • シミュレーション時間を消費できる
    • サスペンドできる
    • wait()関数を呼び出している関数を呼び出せる
  3. SC_CTHREAD(func, event)
    • 特殊なSC_THREAD
    • センシティビティはクロックエッジイベントのみ

登録はいつ行われるか。

  1. コンストラクタ内
  2. モジュールの before_end_of_elaboration か end_of_elaboration コールバック内
  3. コンストラクタやコールバックから呼び出されるメンバー関数内

制約

  1. 登録できるのは同じモジュールのメンバー関数のみ
  2. SC_CTHREADはend_of_elaboration コールバックから呼び出してはいけない

注記

  1. SC_THREADはSC_METHOD, SC_CTHREADでできることは何でもできる
  2. SC_THREAD, SC_CTHREADプロセスを再び呼び出すには exitしないように whileループを回す必要がある。
  3. SC_METHODはwhileループが不要。next_trigger()によって再び呼び出される。
  4. シミュレーション時間はプログラムの実行時間とは異なり、シミュレーションカーネルにより管理されるカウンタである。

Simulation Stages

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

SystemCには3つのphase/stageがある

  1. Elaboration
    • sc_start()の前に実行されるstatement
    • エラボレーション中にモジュール階層が作られ、portとexportがチャネルにバインドされる。
  2. Execution: さらに2つのstageに分解できる
    1. Initilization
      • シミュレーションカーネルがすべてのプロセスを認識し、runnableかwaitingかに分類する
      • "no initialization"を要求するプロセス以外はすべてrunnableとなる
    2. Simulation: さらに内部的に2つのphaseがある。
      1. evaluate
        • すべてのrunnableなプロセスを一気に実行する。それぞれのプロセスはwait()かreturnに到達するまで実行される。runnableなプロセスがなくなったら停止する。
      2. advance-time
        • runnableなプロセスがなくなったら、シミュレーションはadvance-timeフェーズに入り以下を行う。
        1. シミュレーション時間を現時刻から最も近いスケジュール済みイベントまで進める
        2. その時刻まで待っている特定のプロセスをrunnable状態にする
        3. evaluation phaseに戻る
        • 以下の条件のいずれかも成立しない限りadvance-timeの継続が行われる
        1. すべてのプロセスが終了した
        2. sc_stop()がプロセスから呼ばれた
        3. 最大時刻に到達した
  3. Cleanup(あるいはpost-processing)
    • オブジェクトの破棄、メモリ解放、ファイルのcloseなど

各モジュールは以下のコールバック関数を持つことができる。

  1. virtual void before_end_of_elaboration()
  2. virtual void end_of_elaboration()
  3. virtual void start_of_simulation()
    • sc_start()が複数回呼ばれるときは最初の1回だけ呼び出される。
  4. virtual void end_of_simulation()
    • sc_stop()が複数回呼ばれるときは1回だけ呼び出される。
    • 補注:どうやらsc_stop()が呼ばれないとコールバックされないらしい?(最大時刻到達でシミュレーション終了する場合はinvokeされないようだ)

Time Notation

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

アプリケーション実行時間とシミュレーション時間の違いに注意。
SystemCではsc_time型がある。SC_SEC, SC_MS, SC_US, SC_NS, SC_PS, SC_FS の単位がある。
sc_time型は比較や演算ができる。
SC_ZERO_TIMEという0秒を表すマクロがある。いわゆるデルタ遅延のために使用される。
シミュレーション時刻を得るにはsc_time_stamp()関数を呼べばいい。

Concurrency

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

SystemCは並行実行をモデリングする。実際に並行実行しているわけではない。
複数のプロセスが並行実行しているとき、実際には一つのプロセスだけ実行されている。しかし、実行中のすべての並行プロセスが現タスクを完了するまでシミュレーション時刻は進まない。
したがって、これらのプロセスは同じシミュレーション時刻で並行実行していることになる。これがGo言語など実際の並行実行とは異なる点である。