在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事件。
答案 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 */ }