Как я могу проверить разницу между sc_buffer и sc_signal?

Я хотел бы проверить разницу между использованием sc_buffer а также sc_signal, Я кодировал модуль, который добавляет два случайных числа, а затем параллельно запускаю два теста: один с использованием sc_buffer а другой использует sc_signal, Тем не менее, когда я проверяю с gtkwave Я вижу одинаковые следы для обоих примеров, поэтому я думаю, что для этого случая не должно быть никакой разницы. Как я могу проверить разницу? или эти два разных типа каналов предназначены для разных приложений?

2 ответа

Решение

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 функции для создания уведомлений для каждого изменения. Поэтому, если вы генерируете новые номера, которые совпадают с предыдущим числом, записанным в канал, и вы выводите какой-то вывод при каждом уведомлении о событии, вы должны увидеть некоторую разницу.

Другие вопросы по тегам