1

如果我在 SystemC 中有两个线程,A 和 B(都是 SC_THREAD),并且如果 B 中的变量或事件被断言,我希望线程 A 停止执行(被重置),那么完成此操作的正确方法是什么。

这是一个更具说明性的示例:

// Thread A: Data transfer
SC_THREAD(rx_tx_transfer);
  dont_initialize();
  sensitive << clk.pos();

// Thread B: If the value of the control registers changes 
// during a transfer, the transfer should be aborted
  SC_THREAD(check_reg_write_during_tx);
    sensitive << x_event << y_event;

所以,我希望线程 A 在线程 B 中触发事件或信号后立即停止它正在执行的操作。如果在 AI 中每次等待相关事件和常规 clk.pos() 时,这可能会实现,然后像这样执行 if-else:

void rx_tx_transfer()
{
  // code
  wait(clk.pos() | event_from_b);
  if (clk.read() == SC_LOGIC_1 & event_from_b_var)
  {
    //...
  }
  else if (clk.read() == SC_LOGIC_1)
  {
    //...
  }
  else
  {
    //...
  }

  // other code
  wait(clk.pos() | event_from_b);
  // repeated if-else code from above
}

我不喜欢这个解决方案,希望有一个我不熟悉的更好的方法。也许我应该在 SC_THREAD 中使用 async_reset_signal_is(),如下所示:

// Thread A: Data transfer
SC_THREAD(rx_tx_transfer);
   dont_initialize();
   sensitive << clk.pos();
   async_reset_signal_is(sig_form_b, true);

无论 rx_tx_transfer 函数的当前执行状态如何(即,它还没有到达下一个 wait()),这是否会在 sig_form_b 被资产时停止线程 A 的执行并进入重置状态?

如果有更好或更合适的方法来做到这一点,请分享。

4

1 回答 1

1

我不确定你真正想要实现什么:停止线程和重置它是两件不同的事情。

如果线程配置了 async_reset_signal_is,您可以使用重置信号重置线程。如果置位复位信号,线程将从头开始。

SystemC 线程不是真正的线程,而是以非抢占方式顺序执行的协程。所以每一时刻只有一个线程在执行,没有人能真正阻止它。线程可以通过调用 wait() 方法自行停止并将控制权传递给调度程序。

于 2016-08-16T05:34:35.637 回答