如何检查 sc_buffer 和 sc_signal 之间的区别?
How can I check the difference between sc_buffer and sc_signal?
我想检查使用 sc_buffer
和 sc_signal
之间的区别。我编写了一个添加两个随机数的模块,然后我 运行 并行进行两项测试:一个使用 sc_buffer
,另一个使用 sc_signal
。然而,当我检查 gtkwave
时,我看到两个示例的痕迹相同,所以我认为对于这种情况应该没有任何区别。我怎样才能检查差异?还是这两种不同类型的通道适用于不同的应用?
sc_buffer
和sc_signal
的区别可以看下面的答案。
In SystemC, can the sc_signal_in/out type port be bound to the primary channel sc_buffer?
sc_buffer
基本上是从 sc_signal
派生出来的,它重新实现了 write
和 update
函数来为每次更改生成通知。
因此,如果您生成的新数字与写入通道的先前数字相同,并且您在每个事件通知中转储一些输出,您应该会看到一些差异。
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
没有检测到 2 ns 发送的字符。
您不会在 VCD 跟踪中看到任何差异,因为存储在 sc_buffer
和 sc_signal
通道中的值是相同的。区别在于接收器何时被触发。
我想检查使用 sc_buffer
和 sc_signal
之间的区别。我编写了一个添加两个随机数的模块,然后我 运行 并行进行两项测试:一个使用 sc_buffer
,另一个使用 sc_signal
。然而,当我检查 gtkwave
时,我看到两个示例的痕迹相同,所以我认为对于这种情况应该没有任何区别。我怎样才能检查差异?还是这两种不同类型的通道适用于不同的应用?
sc_buffer
和sc_signal
的区别可以看下面的答案。
In SystemC, can the sc_signal_in/out type port be bound to the primary channel sc_buffer?
sc_buffer
基本上是从 sc_signal
派生出来的,它重新实现了 write
和 update
函数来为每次更改生成通知。
因此,如果您生成的新数字与写入通道的先前数字相同,并且您在每个事件通知中转储一些输出,您应该会看到一些差异。
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
没有检测到 2 ns 发送的字符。
您不会在 VCD 跟踪中看到任何差异,因为存储在 sc_buffer
和 sc_signal
通道中的值是相同的。区别在于接收器何时被触发。