Learn SystemC - Event

本文介绍了SystemC中的事件对象sc_event,如何创建即时、定时通知,以及事件的挂起和取消机制。通过示例展示了如何使用这些功能进行事件触发和捕获。
摘要由CSDN通过智能技术生成

本文为英文版本翻译,原文地址:Event

事件

事件(event)是一个sc_event对象,用于仿真过程同步。
仿真过程可以通过事件触发。

sc_event包含以下方法:

  1. void notify(): 创建一个即时通知(immediate notification)
  2. void notify(const sc_time&), void notify(double, sc_time_unit):
    a) zero time: 创建一个delta notification.
    b) non-zero time: 创建一个定时通知(timed notification)
  3. cancel(): 取消该事件挂起的通知(pending notification)
    a) 事件最多有一个挂起的通知
    b) 即时通知不能取消

限制

  1. sc_event对象可以在阐述(elaboration)或仿真(simulation)阶段构造
  2. 事件可以在阐述或仿真阶段通知,但是即时通知不能在阐述阶段及以下回调中创建:
    a) before_end_of_elaboration
    b) end_of_elaboration
    c) start_of_simulation

挂起通知

一个事件最多只能有一个挂起通知(pending notification)

  1. 如果已经有挂起通知的事件调用notify,只有最临近当前时间的通知生效
  2. 较晚时间发生的通知会取消(或者不会被安排)
  3. 即时通知(immediate notification)比delta notification发生时间早, delta notification比定时通知(timed notification)发生时间早,这和调用顺序无关

事件可以相互组合,以及和定时器组合。
下面是只等待一个事件的示例:

// Learn with Examples, 2020, MIT license
#include <systemc>
using namespace sc_core;

SC_MODULE(EVENT) {
  sc_event e; // 声明一个时间
  SC_CTOR(EVENT) {
    SC_THREAD(trigger); // register a trigger process
    SC_THREAD(catcher); // register a catcher process
  }
  void trigger() {
    while (true) { // infinite loop
      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) { // loop forever
      wait(e); // wait for event
      std::cout << "Event cateched at " << sc_time_stamp() << std::endl; // print to console
    }
  }
};

int sc_main(int, char*[]) {
  EVENT event("event"); // define object
  sc_start(8, SC_SEC); // run simulation for 8 seconds
  return 0;
}

运行结果:

Event cateched at 1 s     # trigged at 0 s
Event cateched at 3 s    # triggered at 2 s
                                        # the event triggered at 4 s is cancelled
Event cateched at 7 s   # triggered at 6 s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值