编辑
2024-03-18
SystemC
00
请注意,本文编写于 396 天前,最后修改于 396 天前,其中某些信息可能已经过时。

目录

事件
Event.cpp
结果

事件

事件是用于进程同步的 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 的顺序无关。 事件可以相互组合,也可以与计时器组合。

Event.cpp

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 许可协议。转载请注明出处!