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

时间:2016-08-15 10:56:47

标签: hardware hdl systemc register-transfer-level

如果我在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中触发事件或信号时立即停止它正在做的事情。如果在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);

当sig_form_b被置位时,无论rx_tx_transfer函数的当前执行状态(即,它还没有到达下一个wait()),这会停止线程执行并进入复位状态吗?

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

1 个答案:

答案 0 :(得分:1)

我不确定你真正想要实现的目标:停止线程并重置它是两回事。

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

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