Learn SystemC with Examples #9 (Clock~Interrupt a thread while busy, template class)

Clock

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

sc_clockはsc_signalから派生したプリミティブチャネルで、クロックのモデリングに使われる。
クロックの値やイベントはsc_signal_in_if<bool>インタフェース経由でアクセスできる。
コンストラクタの各引数の意味は上のリンク参照。

Process: CTHREAD

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

SC_CTHREAD:

  1. SystemC 2.0 では deprecated. 2つ目の引数がイベントファインダーの場合はまだサポートされる。
  2. プロセス登録時にクロックを必要とする。
  3. SC_METHODやSC_THREADのようなセンシティビティリストを持たない
  4. 指定したクロックエッジが起こった時に起動される。

Handle trigger while busy

https://www.learnsystemc.com/pattern/trigger_when_busy

スレッドがBusy状態の時、来ているトリガーをlistenしていない。ありうるデザインパターンとして以下がある。

  1. 2つのスレッドを作る。トリガーハンドラーとタスクプロセッサ。
  2. トリガーハンドラーでのアクション
    • トリガーを受信したとき、タスクプロセッサがBusyかどうか確認し、Busyでなければタスクをディスパッチする。
    • そうでなければ、トリガーをバッファする。
  3. タスクプロセッサでのアクション
    • トリガーハンドラによってディスパッチされたタスクの実行
    • 完了後、トリガーバッファをチェックする
      • 空ならreturn。そうでなければバッファからトリガーをpopし、タスクを実行

この方式はFIFOチャネルと似ている。しかし、オリジナルのトリガー型を修正する必要がない。

Handle trigger while busy, template class

https://www.learnsystemc.com/pattern/trigger_when_busy2

前チャプターと同様の機構をテンプレートクラスによって実現している。

Interrupt a thread while busy

https://www.learnsystemc.com/pattern/interrupt_when_busy

スレッドが割り込みを受けるには以下が必要

  1. スレッド実行中に割り込みをモニタ
  2. 割り込み処理をする
    • abort もしくは
    • pause してあとで resume

Interrupt a thread while busy, template class

https://www.learnsystemc.com/pattern/interrupt_when_busy2

前チャプターと同様の機構をテンプレートクラスによって実現している。