如何检查sc_buffer和sc_signal之间的区别?

时间:2016-07-01 12:40:09

标签: c++ systemc gtkwave

我想检查使用sc_buffersc_signal之间的区别。我编写了一个模块,它添加了两个随机数,然后我并行运行了两个测试:一个使用sc_buffer,另一个使用sc_signal。然而,当我用gtkwave检查时,我看到两个例子都有相同的痕迹,所以我认为对于这种情况应该没有任何区别。我该如何检查差异?或者这两种不同类型的通道是否适用于不同的应用?

2 个答案:

答案 0 :(得分:3)

sc_buffer在抽象级别进行建模时可能最有用。

例如,考虑建模串行通信通道。发射器可以连续两次发送相同的字符。如果使用sc_signal作为频道,接收方将无法检测到第二个字符,但如果使用sc_buffer,则会接收到。{/ p>

#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发送的字符。

您不会发现VCD跟踪有任何差异,因为sc_buffersc_signal频道中存储的值相同。不同之处在于接收器被触发时。

答案 1 :(得分:0)

您可以查看以下答案,了解sc_buffersc_signal之间的差异。

In SystemC, can the sc_signal_in/out type port be bound to the primary channel sc_buffer?

sc_buffer基本上来自sc_signal,它重新实现了writeupdate函数,以便为每次更改生成通知。 因此,如果您生成的新数字与写入通道的前一个数字相同,并且您在每个事件通知中转储一些输出,那么您应该看到一些差异。