4

在 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 事件。

4

3 回答 3

0

你做得对,我只是使用void preempt()which calls notify,而不是通过接口返回事件。

于 2011-07-07T14:08:48.520 回答
0

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

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

因为只有在精化阶段结束时,您才能确定端口已经绑定到现有preempt_event通道。

在woker 模块中对事件做出反应的另一种方法是,您可以wait(preempt_event->preempt_event())在 normalSC_THREADnext_trigger(preempt_event->preempt_event())normal 中使用SC_METHOD。这两种方式都允许您的流程动态地对事件敏感。然后在您的调度程序模块中,您可以再次创建sc_port<preempt_event_if>并访问preempt_event().notify()以将事件发送到工作模块。

于 2013-10-11T20:30:55.767 回答
0

SystemC事件主要用于调度一个进程执行,不持有任何可查询的状态,所以没有什么让你知道事件是否发生。

sc_buffer为此,您需要使用 a 。bool只需在 worker 中声明一个类型的输入端口:

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 */ }
于 2018-04-15T17:00:27.113 回答