SystemC:在模块之间传递事件

时间:2011-02-15 21:26:12

标签: 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() const = 0;
};

使用该事件的频道将其定义如下:

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

其中preempt_interrupt是从通道功能中获得通知的SystemC事件。

3 个答案:

答案 0 :(得分:0)

你做得对,我只使用调用notify的void preempt(),而不是通过界面返回事件。

答案 1 :(得分:0)

在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()以将事件发送到工作模块。

答案 2 :(得分:0)

SystemC事件主要用于安排执行过程,并且不保留任何可以查询的状态,因此您无需知道事件是否已发生。

您需要使用sc_buffer来实现此目的。只需在worker中声明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 */ }