Я хотел бы проверить разницу между использованием sc_buffer
а также sc_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
не обнаружил символ, отправленный в 2 нс.
Вы не увидите никакой разницы в трассировке VCD, потому что значения, хранящиеся в sc_buffer
а также sc_signal
каналы идентичны. Разница в том, когда приемник срабатывает.
Вы можете посмотреть на ответ ниже для различий между sc_buffer
а также sc_signal
,
Может ли в SystemC порт типа sc_signal_in / out быть привязан к первичному каналу sc_buffer?
sc_buffer
в основном происходит от sc_signal
и он повторно реализует write
а также update
функции для создания уведомлений для каждого изменения.
Поэтому, если вы генерируете новые числа, которые совпадают с предыдущим числом, записанным в канал, и вы выводите какой-то вывод при каждом уведомлении о событии, вы должны увидеть некоторую разницу.