Applistar

5. 8 プロセス

TOP > 5 SystemC入門 > 5. 8 プロセス
  5. 8 プロセス  

5. 8 プロセス

SystemC はモジュールを組合せてシステム全体を記述します。 そのモジュールの中の「処理の単位」をプロセスと言います。 そのプロセスを記述する時には thread と method の二通りの種類が使えます。 プロセスの記述内容は 名前と引数の宣言、プロセスの種類の宣言、定義内容 の三点からなります。

【名前と引数の宣言】

名前と引数の宣言は モジュール(SC_MODULE) で定義する中に書きます。

SC_MODULE(cpu)
{
 public:
  // ポート
  // 内部データ

  void main();             // プロセスの宣言
  void cpureset();         // プロセスの宣言

【種類の宣言】

そうして、コンストラクタ (SC_CTOR) の中で、 そのプロセスの種類を指定します。

  SC_CTOR(cpu) {
    SC_METHOD(cpureset);       // Method と宣言
    ... // 起動条件
    SC_METHOD(main);           // Method と宣言
    ... // 起動条件
  }
};

【定義内容】 プロセスの実装は、次のように書きます。文法的には、上の SC_MODULE の中に書くことも、また例えば別のファイルに書くことも出来ます。 良く行なわれる方法は、上のようなモジュールの宣言を filename.h に書き、 filename.cpp の中に実装を書くという方法です。その時には次の一行目のように include 文を使って宣言部分を参照します。

#include "filename.h"
..
cpu::main() {
....
}

そのプロセスの種類を指定する方法には三種類あります。

種類 記述モデル 起動 動的起動 途中停止 実行 抽象度 通信
SC_THREAD UTF, TF sensitive wait FIFO
SC_CTHREAD BCA クロック指定 wait    
SC_METHOD RTL sensitive next_trigger ×    

5. 8. 1 SC_THREAD(func)

  • 静的センシティビティ→
  • watchingによる再起動は書けません
  • 何も考えないと、一回実行されるだけ。通常は無限ループの形で記述します
  • その他に動的センシティビティも可、その時はwait(event), wait(time)などの指定が出来ます
  • time zeroで実行されます
  • dont_initializeを使うとその初期化部分(time_zeroの実行)を無効化出来ます

dont_initialize を使う 時には、次のように書きます。

        SC_THREAD(proc);
        sensitive << clk.pos();
        dont_initialize();

thread プロセスは、シミュレーション開始時に一回だけ実行されます。 そうして wait()文があると、そこで停止します。この時に、 特に何も指定しなくても、暗黙にプロセスの状態を保存します。 sensitivity 文で指定された条件に一致すると、実行を再開します。 この時に、中断時に保存されていた状態は元に戻され、wait 文の次の行から実行を開始します。

もし一回だけでなくて、何回も実行する必要がある時には、 繰返しを明示的に書きます。 例えば、無限ループの形にしておきます。 これで何回も実行されるようになります。

もし無限ループがなくて、wait 文もなかった場合には、 一つのデルタサイクルの中で、 全体が一回だけ実行されて、終了してしまいます。

無限ループはあるけれど、wait 文が一回も呼出されてなかった場合、 そのプロセスは一つのデルタサイクルの中で、 実行が続行します。この場合、他のプロセスが実行されることはありません。

thread プロセスは、静的・動的の片方または両方の起動条件を設定出来ます。 動的起動条件は wait() に一つ以上の引数を付けて作ります。

この wait 文は、 thread プロセス内、 モジュール、またはチャネルのメソッドのメンバ関数のプロセス内に記述出来ます。

5. 8. 2 SC_CTHREAD(func, edge)

SC_CTHREAD で指定する func はクロック付の thread です。宣言の引数にそのクロックを 指定します。

  • clockを指定します。その立上・立下りで活性化
  • dont_initializeは使えません(意味がありません)
  • watching()で再起動の条件を記述出来ます(bool型)
  • クロックのみに反応します
  • 静的センシティビティ
wait() ; 一クロックの間停止
wait(整数); 整数クロックの間停止
wait_until(条件式); 条件式が真になるまで停止
  • time zeroでは実行されません
  • 2.0.1では、SC_THREADがあるので、不要になったと考えられています。いくつかの事情はあるものの、今後は使わない方向です

5. 8. 3 SC_METHOD(func)

  • 静的センシティビティ
  • SC_CTORでsensitive <<のように「指定された入力」(のどれか一つでも)変化した時に一回実行されます。「指定された入力」は、
    SC_CTOR(モジュール名){
      SC_METHOD(プロセス名);
      sensitive_pos << シグナル名;
    }

のように指定します。 SC_METHOD と宣言したプロセスの中には、 wait() は書けません(実行時に誤りとされます)。

SC_METHOD(func) のように宣言されたプロセスをメソッド・プロセスと言います。 このプロセスは実行が開始されると、全体を実行します。 実行の途中で止めてまた再開する、というようなことは出来ません。 プロセスが終了すると、処理が SystemC シミュレーションカーネルに戻されます。 内部には状態は持てません。終了すると、全て忘れてしまいます。 もしいくつかの実行の間で、状態(内部変数)を必要とする場合には、 そのプロセスが属するモジュールのデータメンバとして宣言した 変数を使います。

このプロセスは、途中で止めることは出来ません。 もしそのつもりで wait() を書くと、実行時に誤りとされます。

起動の条件は sensitive 文で設定します。これは静的な条件ですが、 next_trigger 文を使えば、動的な条件も設定出来ます。 ただ、文字通り、これはそこで止る訳ではなく、 次の起動条件を設定するものです。その時には sensitive 文の方の設定は一時的に無効化されます。 sensitive で設定したものを再び生かすには next_trigger を引数無で実行します。

5. 8. 4 SC_CTHREAD → SC_THREAD の書替

SC_CTHREAD で

   wait_until( x.delayed() == true );

と書いていたものは、SC_THREAD では

  do
  {
    wait();
  } while (!x.read());

と書きます。

(ある時点で) Synopsys の動作合成の処理系では SC_CTHREAD が使えて SC_THREAD が使えない ということがあります。 http://www.systemc.org/forum/forum.php?thread_id=1780&forum_id=15 このため、しばらくは、SC_CTHREAD も使われます。

これら SC_THREAD, SC_CTHREAD, SC_METHOD の定義は system-2.0.1/kernel/sc_module.h の 530 行目付近にあります。

5. 8. 5 sensitive 文

プロセスの起動条件を設定するのには sensitive 文を使います。 (SC_METHOD 20041011 版では p96 と要調整)

  5. 8 プロセス  
TOP > 5 SystemC入門 > 5. 8 プロセス