如果我在 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 的执行并进入重置状态?
如果有更好或更合适的方法来做到这一点,请分享。