我如何检查sc_buffer和sc_signal之间的差异

How can I check the difference between sc_buffer and sc_signal?

本文关键字:sc signal 之间 buffer 检查 何检查      更新时间:2023-10-16

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

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

例如,考虑对串行通信通道进行建模。发送器可以在一行中两次发送相同的字符。如果使用sc_signal作为通道,则接收器不会检测到第二个字符,但使用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没有检测到在2ns发送的字符。

在VCD跟踪中不会看到任何差异,因为存储在sc_buffersc_signal通道中的值是相同的。区别在于何时触发接收器

您可以查看下面的答案,了解sc_buffersc_signal之间的区别。

在SystemC中,sc_signal_in/out类型端口可以绑定到主通道sc_buffer吗?

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