2

I have a SystemVerilog task I am trying to port to SystemC. The body of the task simply waits on a boolean expression and then pushes onto a queue. The SystemC wait mechanism doesn't work quite the same way though, it will only wait on time or events.

So I'm wondering what is the minimum length of cycles/time that SystemVerilog wait() will wait before re-testing the boolean expression. In other words, how often or what drives re-testing of boolean expressions in SV wait()?

If the answer is simply once every cycle, which I hope and expect but can not confirm, then the solution is easy.

Here is the code, with some things renamed and simplified to make more sense out of context:

    virtual task put(input cls_item item);
        wait (queuecount < queuemax);
        push_back(item);
    endtask
4

2 に答える 2

3

LRM から:

9.4.3 レベル依存のイベント制御

条件が真になるまで、手続き型ステートメントの実行を遅らせることもできます。これは、特殊な形式のイベント制御である wait ステートメントを使用して実現されます。エッジに依存する基本的なイベント制御 (@ 文字で指定) とは対照的に、wait ステートメントの性質はレベルに依存します。

待機ステートメントは条件を評価します。false の場合、wait ステートメントに続く手続き型ステートメントは、続行する前にその条件が true になるまでブロックされたままになります。

基本的には、wait(<boolean expression>)連続して表情をチェックしていると考えてよいでしょう。式が true になると、待機がブロック解除され、順次コードの実行が続行されます。

が最初に検出されたときに式が true の場合、wait()まったく待機しません。

于 2012-11-08T18:06:04.877 に答える
1

wait(expression)常に条件式を継続的にチェックしていると考えることができることに同意します。これは設計者の考えですが、コンピュータ プログラムをそのように設計することはできません。または、条件チェック ループで CPU 時間を無駄にします。

ではSystemVerilog、コンパイラがブール式をイベントとしてモデル化する場合があります。実行が実行されwait()、条件が false の場合、シミュレーション カーネルは現在のスレッドを中断し、他のスレッドを実行します。queuecountシミュレーションでは、 orが変更されるたびに、演算子queuemaxを使用して条件が再計算されます。<条件が満たされると、イベントがトリガーされ、待機中のスレッドが再スケジュールされ、実行を再開する準備が整います。

ではSystemCC/C++ワールド プラス イベント ドリブン ハードウェア モデリング ライブラリであるため、 のC/C++ような関数を書くのは自然なことですfunction(<condition expression>)。ただし、のC/C++ようにコンパイルした後GCC、実際には、プログラムは最初に を評価して<condition expression>から、関数への引数として渡します。ソフトウェアのやり方です。機能的にはor or 0/1wait()しか見えないので、あなたが何を待っているかを知っています。ハードウェア モデリングにおけるの真の目的には意味がありません。したがって、 はSystemC でのみ引数を受け入れることができます。例えば、truefalsewait()wait()event

wait (event);       // waiting for the event
wait (a_signal);    // signal interface has value_changed_event, posedge_event, negedge_event
wait (10, SC_NS);   // simulation time is also an event in SC kernel

wait()SystemVerilog などで同じ条件をモデル化する場合は、イベントの詳細を手動で記述する必要があります。以下は概念実証の疑似コードです。SystemC または sc_fifo クラスの例を見つけることができます。

    sc_event           waiting_event;

    void put( ... ) {
        while (!(queuecount < queuemax))
            wait( waiting_event);
        push_back(...);
    }

    void get( ... ) {
        ...
        notify_queue_available();
    }

    void notify_queue_available() {
        if (queuecount < queuemax)
            waiting_event.notify();
    }
于 2012-11-09T00:29:28.970 に答える