2

sc_bufferとの使用の違いを確認したいと思いsc_signalます。2 つの乱数を追加するモジュールをコーディングしてから、2 つのテストを並行して実行します。1 つは を使用sc_bufferし、もう 1 つは を使用しsc_signalます。それにもかかわらず、私が確認するとgtkwave、両方の例で同じトレースが表示されるため、この場合は違いはないと思います. どうすれば違いを確認できますか?それとも、これら 2 つの異なるタイプのチャネルが異なるアプリケーションを対象としているということですか?

4

2 に答える 2

3

sc_buffer抽象レベルでモデリングする場合におそらく最も役立ちます。

たとえば、シリアル通信チャネルのモデリングを考えてみましょう。送信機は、同じ文字を 2 回続けて送信できます。チャネルとして が使用された場合sc_signal、受信機は 2 番目の文字を検出しませんが、 を使用すると検出されsc_bufferます。

#include <systemc>
#include <iostream>

using namespace sc_core;
using namespace std;

struct Transmitter : public sc_module {

    sc_out<char> out;

    Transmitter(sc_module_name name) : sc_module(name) {
        SC_THREAD(transmit);
    }

    void transmit() {
        wait(1, SC_NS);
        out.write('x');

        wait(1, SC_NS);
        out.write('x');

        wait(1, SC_NS);
        out.write('y');
    };

    SC_HAS_PROCESS(Transmitter);
};

struct Receiver : public sc_module {

    sc_in<char> in;

    Receiver(sc_module_name name) : sc_module(name) {
        SC_METHOD(receive);
        sensitive << in;
        dont_initialize();
    }

    void receive() {
        cout << sc_time_stamp() << ": " << name() << " received "
             << in.read() << endl;
    }

    SC_HAS_PROCESS(Receiver);
};

int sc_main(int argc, char* argv[])
{
    sc_signal<char> signal;
    sc_buffer<char> buffer;

    Transmitter signal_transmitter("signal_transmitter");
    Receiver signal_receiver("signal_receiver");
    Transmitter buffer_transmitter("buffer_transmitter");
    Receiver buffer_receiver("buffer_receiver");

    signal_transmitter.out(signal);
    signal_receiver.in(signal);

    buffer_transmitter.out(buffer);
    buffer_receiver.in(buffer);

    sc_start();

    return 0;
}

上記の例では、次の出力が生成されます。

1 ns: signal_receiver received x
1 ns: buffer_receiver received x
2 ns: buffer_receiver received x
3 ns: signal_receiver received y
3 ns: buffer_receiver received y

signal_receiver2 ns で送信された文字を検出しなかったことに注意してください。

sc_bufferとのsc_signalチャネルに格納されている値は同一であるため、VCD トレースに違いは見られません。違いは、レシーバーがトリガーされたときです。

于 2016-07-01T23:44:13.030 に答える
0

sc_bufferとの違いについては、以下の回答をご覧くださいsc_signal

SystemC では、sc_signal_in/out タイプのポートをプライマリ チャネル sc_buffer にバインドできますか?

sc_bufferは基本的に から派生し、および関数をsc_signal再実装して、変更ごとに通知を生成します。そのため、チャネルに書き込まれた前の数値と同じ新しい数値を生成し、各イベント通知で出力をダンプしている場合、いくつかの違いが見られるはずです。writeupdate

于 2016-07-01T14:40:57.370 に答える