systemc:如何检测两个事件同时发生

问题描述 投票:0回答:1

我正在使用 systemc 来建模基于数据包的网络。有两个并行线程,处理随机大小的数据包。在每个数据包之后,我想检查另一个线程是否恰好处于相同的状态(数据包边界)以避免冲突。

知道如何检测此类事件并发性吗?

events systemc
1个回答
0
投票

直接回答有关检测同一模拟时间发生的事件的方法的问题:

sc_time_stamp()
将返回当前模拟时间。

如果你的线程在构造数据包时记录了“最后一个数据包时间”,那么第二个执行的线程可以将其模拟时间与“最后一个数据包”的时间进行比较。匹配表示并发情况,第二个执行线程可以等待发送其数据包。

sc_time last_pkt_time = sc_time(0,SC_NS);

void pktgen1_thread() {
 ...
 if (last_pkt_time != sc_time_stamp()) {
   send_pkt();
 else {
   wait();  // wait to send in a later iteration of thread loop

我不确定您正在开发什么样的系统,以及您是否通过“事件”特指

sc_event
,但我认为您真正想要的是基于数据包的可用性进行仲裁。您可以有一个单独的仲裁线程来检查 2 个 FIFO 是否有数据包并选择一个进行处理:

  void pktgen1_thread() {
    ...
    MyPkt pkt = build_pkt();
    pktgen1_fifo.write(pkt);
    ...
  }

  void arbiter_thread() {
    while (1) {
      MyPkt pkt;
      if (pktgen1_fifo.available()) {
        pkt = pktgen1_fifo.read();
        process_pkt(pkt);
      } else if (pktgen2_fifo.available()) {
        pkt = pktgen2_fifo.read();
        process_pkt(pkt);
      }
      wait();
    }
  }

所需的确切编码风格将取决于您的 SystemC 使用案例(TLM LT/AT 模型与综合兼容)。

© www.soinside.com 2019 - 2024. All rights reserved.