2017-08-21 11 views
1

私はsystemcでイベント生成を理解しようとしています。私はそれがコンストラクタのスレッド登録の順序に依存することを発見しました。システムでのイベント生成

#include <systemc.h>                         
    SC_MODULE(EventTest){             
     sc_event ev1; 
     void p1(){ 
      ev1.notify(); 
      ev1.notify(0, SC_NS);                      
     } 

    void p2(){ 
     wait(ev1); 
     cout<<"ev1 is activated at "<<sc_time_stamp()<<endl;   
     wait(ev1); 
     cout<<"ev1-2 is activated at "<<sc_time_stamp()<<endl;   
    } 
    SC_CTOR(EventTest){             
     SC_THREAD(p1); 
     SC_THREAD(p2);          
    } 
};  

int sc_main(int argc, char *argv[]){         
    EventTest d("d");            
    sc_start(); 
    return 1; 
} 

出力:ev1 is activated at 0 s

私はSC_CTORに変更した場合に>

SC_THREAD(p2); 
SC_THREAD(p1); 

は、出力されます>

ev1 is activated at 0 s 
ev1-2 is activated at 0 s 

誰かが登録順に影響しない方法を教えてくださいイベントの生成?

答えて

2

あなたのコードは、SystemCスレッドであるp1p2の2つのSystemCプロセス(SystemCスレッドまたはプロセスはプロセスと呼ばれます)で構成されています。それらは、シミュレーションの最初のデルタサイクル中に実行されます。ただし、SystemC標準では、同じデルタサイクルでプロセスの実行順序が保証されていません。

  • p1が最初に実行された場合、それはイベントev1にアンタイムドの通知を行います。 IEEE Std 1666-2011の5.10.6セクションを参照してください。

    空の引数リストでメンバ関数notifyを呼び出すと、即時通知が作成されます。イベントに敏感なすべてのプロセスインスタンスは、現在実行されているプロセスインスタンスを除いて、notify関数から制御が返される前に実行可能になり、静的または動的の感度にかかわらず即時通知により実行可能にならないものとする。

    しかし、何もイベントを待っていません。通知は何もしません。 p1は時限通知を行います。関数が通知場合

    関数への呼び出しが、所与の時間に時限通知を作成しなければならない非ゼロの時間を表す引数で通知がシミュレーション時間に対して表さ:その場合は、動作は 異なりますが呼び出されます。言い換えると、time引数の値が現在のシミュレーション時間に加算され、イベントが通知される時刻が決定されます。時間引数は負であってはならない。 注 - デルタ通知の場合、デルタ通知フェーズでイベントに敏感なすべてのプロセスは、後続の評価フェーズで実行可能になります。タイムド・ノーティフィケーションの場合、イベントが発生した時点でイベントに敏感なすべてのプロセスは、その時点で実行可能になり、将来のシミュレーション時間になります。

    最後に、プロセスp1が終了し、p2が実行されます。最初のwaitは処理を一時停止します。イベントの保留中の通知が伝播され、プロセスp2のロックが解除されます。その後、プロセスp2は、2番目のwaitを実行し、再度サスペンドします。何もイベントに通知しないので、シミュレーションは終了します。

  • p2が最初に実行されると、最初のwaitで中断されます。その後、p1が実行されます。それは最初の通知を行います。 p2が通知を待機していたので、p1は中断され(即時通知)、p2は続行され、2番目のwaitまで移動します。 p2は停止されています。その後、p1が続行されます。それは時間切れの通知を行い、プロセスは終了する。 p2が通知を待っていて、それが発生した場合、p2の実行が続行され、プロセスは終了します。シミュレーションも終了します。

最後に、あなたの2つのケースで、p1は常にあなたが使用SystemCの実装とp2後に実行されます。 SystemCの別の実装では、逆の可能性があります。同じシミュレーション時間に並列実行されると考えるべきです。その場合、両方の注文は正しいです。

最後に、コードが非決定論的な動作につながる可能性があることを意味します。

関連する問題