2016-08-15 264 views
0

如果我在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功能的執行目前的狀態去復位狀態(即它還沒有達到下一個等待())?

如果有更好或更正確的方法來做到這一點,請分享。

回答

1

我不確定你真正想達到什麼目的:停止線程並重置它是兩回事。

如果使用async_reset_signal_is配置了重置信號,您可以重置線程。如果復位信號有效,線程將從頭開始。

SystemC線程不是真正的線程,而是一個以非搶先方式順序執行的協程。所以在每個時刻只有一個線程執行,沒有人可以真正阻止它。線程可以自行停止並通過調用wait()方法將控制權傳遞給調度器。

+0

感謝您的解釋,它非常清晰和簡潔。我認爲在我的場景中要做的正確事情是重置線程A,然後使用wait()在其中執行上下文切換,以便線程B的重置信號(即「sig_from_b」)可以在線程B中取消確立。 – evilpascal

相關問題