如果我在SystemC中有兩個線程,A和B(都是SC_THREAD),並且我希望線程A停止執行(被重置),如果B中的變量或事件獲得斷言,完成這件事的正確方法是什麼?從另一個進程中重置SystemC中的SC_THREAD的正確方法
這裏是一個更說明性的例子:
// 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);
這會阻止線程A執行並sig_form_b被asseted,無論rx_tx_transfer功能的執行目前的狀態去復位狀態(即它還沒有達到下一個等待())?
如果有更好或更正確的方法來做到這一點,請分享。
感謝您的解釋,它非常清晰和簡潔。我認爲在我的場景中要做的正確事情是重置線程A,然後使用wait()在其中執行上下文切換,以便線程B的重置信號(即「sig_from_b」)可以在線程B中取消確立。 – evilpascal