SystemC: передача событий между модулями - PullRequest
4 голосов
/ 16 февраля 2011

В SystemC, каков синтаксис для использования событий в качестве входов / выходов модуля.

У меня есть рабочий модуль, и я хочу отправить ему событие, чтобы выгрузить то, что он сейчас делает, из модуля планировщика.

sc_port<preempt_event_if> preempt_event;

Я объявляю интерфейс в показанном рабочем модулевыше.

Интерфейс определяется следующим образом:

class preempt_event_if : virtual public sc_interface
{
    public:
        virtual const sc_event& preempt_event() const = 0;
};

Канал, который использует событие, определяет его следующим образом:

const sc_event& preempt_event() const { return preempt_interrupt; }

Который, где preempt_interrupt это событие SystemC, которое получает уведомление из функций канала.

Ответы [ 3 ]

0 голосов
/ 12 октября 2013

В модуле woker вы можете использовать список статической чувствительности для создания динамического процесса в переопределенной функции обратного вызова ядра end_of_elaboration ():

SC_METHOD(do_something);
sensitive << preempt_event->preempt_event();

Поскольку только в конце этапа разработки вы уверены, что порт уже связан с существующим preempt_event каналом.

Другой способ отреагировать на событие в модуле woker заключается в том, что вы можете просто использовать wait(preempt_event->preempt_event()) в обычном SC_THREAD или next_trigger(preempt_event->preempt_event()) в обычном SC_METHOD. Оба способа позволяют вашему процессу динамически реагировать на событие. Затем в модуле планировщика вы можете снова создать sc_port<preempt_event_if> и получить доступ к preempt_event().notify(), чтобы отправить событие в рабочий модуль.

0 голосов
/ 15 апреля 2018

События SystemC используются главным образом для планирования процесса на выполнение и не содержат состояния, которое может быть запрошено, поэтому вам нечего знать, произошло событие или нет.

Вам необходимоиспользуйте sc_buffer для этой цели.Просто объявите входной порт типа bool на рабочем месте:

sc_in<bool> i_preempt;

и выходной порт типа bool в планировщике:

sc_out<bool> o_preempt;

и привяжите оба кЭкземпляр буфера:

sc_buffer<bool> preempt;
scheduler.i_preempt.bind(preempt);
worker.o_preempt.bind(preempt);

В модуле планировщика вы можете записать значение true в этот буфер:

o_preempt->write(true);

, а в рабочем вы можете проверить условие posedgeили подождите posedge_event:

wait(event1 | i_preempt->posedge_event());
if (i_preempt->posedge()) { /* do preemption */ }
0 голосов
/ 07 июля 2011

Вы делаете все правильно, я бы просто использовал void preempt(), который вызывает notify, а не возвращал событие через интерфейс.

...