从另一个进程在 SystemC 中重置 SC_THREAD 的正确方法

Proper way to reset a SC_THREAD in SystemC from another process

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

这是一个更说明性的例子:

// 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 中触发事件或信号后立即停止其正在执行的操作。如果在 A 中我将每个等待事件和常规 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);

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

如果有更好或更合适的方法,请分享。

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

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

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