2016-08-15 4 views
0

SystemC, A 및 B (둘 다 SC_THREAD)에 두 개의 스레드가 있고 B의 변수 또는 이벤트가 발생하면 스레드 A가 실행을 중지 (재설정)하도록합니다. 이것이 성취 할 수있는 적절한 방법이라고 주장했다.다른 프로세스에서 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; 

그래서, 나는 어쩌면이있는 경우 수행 할 수있는 스레드 B.에서 이벤트 또는 신호를 발생대로 즉시 무엇을하는지 중지하는 스레드 원하는 : 여기

더 예시입니다 AI 문제의 이벤트 및 일반 clk.pos()을 기다린 후 할 모든에 넣어 경우 - 다른 사람이 같은 :이 솔루션을 좋아하고, 더 나은 방법이 희망하지 않는

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 기능의 실행의 현재 상태를 asseted되는 경우 (상태를 다시 가시겠습니까 즉, 다음 대기()에 도달하지 못했습니까?

더 좋은 방법이나 더 적절한 방법이 있다면 공유하십시오.

답변

1

나는 정말로 당신이 달성하기를 원하는 것이 확실하지 않다 : 쓰레드를 멈추고 그것을 재설정하는 것은 두 가지 다른 일이다.

재설정 신호가있는 스레드를 async_reset_signal_is와 함께 구성한 경우 재설정 할 수 있습니다. 리셋 신호가 어설 션되면 스레드가 처음부터 시작됩니다.

SystemC 스레드는 실제 스레드가 아니지만 co-routine은 비 선점 방식으로 순차적으로 실행됩니다. 그래서 매 순간마다 하나의 쓰레드 만 실행되고 아무도 정말로 멈출 수 없습니다. 스레드는 wait() 메소드를 호출하여 스스로 멈추고 스케줄러에 제어를 넘겨 줄 수 있습니다.

+0

설명을 주셔서 감사합니다. 매우 명확하고 간결했습니다. 내 시나리오에서해야 할 적절한 일은 스레드 A를 다시 설정 한 다음 스레드 A (즉 "sig_from_b")의 재설정 신호가 스레드 B에서 해제 될 수 있도록 wait()를 사용하여 컨텍스트 스위치를 수행하는 것입니다. . – evilpascal