C++ SystemC:在模块之间传递事件

C++ SystemC:在模块之间传递事件,c++,systemc,C++,Systemc,在SystemC中,使用事件作为模块输入/输出的语法是什么 我有一个工作模块,我想向它发送一个事件,以抢占它当前从调度程序模块执行的操作 sc_port<preempt_event_if> preempt_event; 使用事件的通道将其定义为: class preempt_event_if : virtual public sc_interface { public: virtual const sc_event& preempt_event()

在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\u interrupt
是一个SystemC事件,从通道的函数中得到通知。

如果你做得对,我只会使用调用notify的
void preempt()
,而不是通过接口返回事件。

在woker模块中,您可以使用静态敏感度列表在被重写的end_of_detamination()内核回调函数中创建动态进程:

SC_METHOD(do_something);
sensitive << preempt_event->preempt_event();
SC_方法(做点什么);
敏感抢占事件();
因为只有在精化阶段结束时,您才能确定端口已经绑定到现有的
preempt\u事件
通道


在woker模块中响应事件的另一种方法是,您可以在正常的
SC\u线程中使用
wait(preempt\u event->preempt\u event())
,或者在正常的
SC\u方法中使用
next\u触发器(preempt\u event->preempt\u event())
。这两种方法都允许您的流程动态地对事件敏感。然后,在调度程序模块中,您可以再次创建一个
sc\u端口
,并访问
preempt\u事件()。notify()
将事件发送到工作程序模块。

SystemC事件主要用于调度进程执行,不包含任何可查询的状态,因此,您不需要知道事件是否已经发生

sc_port<preempt_event_if> preempt_event;
为此,您需要使用
sc\u缓冲区。只需在worker中声明
bool
类型的输入端口:

sc_in<bool> i_preempt;
并将两者绑定到缓冲区实例:

sc_buffer<bool> preempt;
scheduler.i_preempt.bind(preempt);
worker.o_preempt.bind(preempt);
在worker中,您可以检查
posedge
条件或等待
posedge\u事件

wait(event1 | i_preempt->posedge_event());
if (i_preempt->posedge()) { /* do preemption */ }
wait(event1 | i_preempt->posedge_event());
if (i_preempt->posedge()) { /* do preemption */ }