sc_buffer
との使用の違いを確認したいと思いsc_signal
ます。2 つの乱数を追加するモジュールをコーディングしてから、2 つのテストを並行して実行します。1 つは を使用sc_buffer
し、もう 1 つは を使用しsc_signal
ます。それにもかかわらず、私が確認するとgtkwave
、両方の例で同じトレースが表示されるため、この場合は違いはないと思います. どうすれば違いを確認できますか?それとも、これら 2 つの異なるタイプのチャネルが異なるアプリケーションを対象としているということですか?
2 に答える
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_receiver
2 ns で送信された文字を検出しなかったことに注意してください。
sc_buffer
とのsc_signal
チャネルに格納されている値は同一であるため、VCD トレースに違いは見られません。違いは、レシーバーがトリガーされたときです。
sc_buffer
との違いについては、以下の回答をご覧くださいsc_signal
。
SystemC では、sc_signal_in/out タイプのポートをプライマリ チャネル sc_buffer にバインドできますか?
sc_buffer
は基本的に から派生し、および関数をsc_signal
再実装して、変更ごとに通知を生成します。そのため、チャネルに書き込まれた前の数値と同じ新しい数値を生成し、各イベント通知で出力をダンプしている場合、いくつかの違いが見られるはずです。write
update