事件是用于进程同步的 sc_event 类的对象。 流程实例可以在事件发生时(即,当事件被通知时)被触发或恢复。 任何给定的事件可能会在许多不同的场合被通知。 sc_event 有以下方法: 1. void notification():创建立即通知 2. 无效通知(const sc_time&),无效通知(double,sc_time_unit): a) 零时间:创建增量通知。 b) 非零时间:在给定时间创建定时通知,相对于调用函数notify时的模拟时间表示 3.cancel():删除此事件的任何待处理通知 a) 对于任何给定事件,最多可以存在一个待处理通知。 b) 立即通知无法取消。 限制条件: 1. sc_event 类的对象可以在精化或模拟期间构造。 2. 可以在精化或模拟期间通知事件,但在精化期间或从回调之一创建立即通知将是错误的: a) 阐述结束前, b) 详细阐述结束,或 c) 模拟开始。 给定事件不得有超过一个待处理通知: 1. 如果为已经有待处理通知的事件调用函数notify,则只有计划最早发生的通知才有效。 2. 计划在稍后时间发生的通知应取消(或从一开始就不再安排)。 3. 立即通知被认为早于增量通知发生,并且增量通知早于定时通知发生。这与调用函数notify 的顺序无关。 事件可以相互组合,也可以与计时器组合。
c++#include <systemc>
using namespace sc_core;
SC_MODULE(EVENT) {
sc_event e; // 声明事件
SC_CTOR(EVENT) {
SC_THREAD(trigger); //注册触发进程
SC_THREAD(catcher); // 注册 catcher 进程
}
void trigger() {
while (true) { // 无限循环
e.notify(1, SC_SEC); // 1 秒后触发
if (sc_time_stamp() == sc_time(4, SC_SEC)) {
e.cancel(); // 取消在时间 = 4 秒触发的事件
}
wait(2, SC_SEC); // 等待 2 秒钟,然后再次触发
}
}
void catcher() {
while (true) { // 永远循环
wait(e); // 等待事件
std::cout << "Event cateched at " << sc_time_stamp() << std::endl; // 打印到控制台
}
}
};
int sc_main(int, char*[]) {
EVENT event("event"); // 定义对象
sc_start(8, SC_SEC); // 运行模拟 8 秒
return 0;
}
SystemC 2.3.3-Accellera --- Oct 4 2020 22:59:38 Copyright (c) 1996-2018 by all Contributors, ALL RIGHTS RESERVED Event cateched at 1 s Event cateched at 3 s Event cateched at 7 s
本文作者:古月流新
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!