C++ SystemC:在模块之间传递事件
在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()
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 */ }