从另一个进程在 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() 方法自行停止并将控制权传递给调度程序。
如果我在 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() 方法自行停止并将控制权传递给调度程序。