컴퓨터 구조 실습 #4 - systemC process Lee, JongTae (dksakclsk @naver.com) Dept. Computer Eng. Hankuk University of Foreign Studies RTDCS. 2011
과제 참고 사항 이번 과제는 소스 첨부하지 않으셔도 됩니다. 소스 코딩 대신 소스 분석에 대한 부분을 문제 해석이나 해결 방안 등의 항목에 기술하세요. 앞으로 시스템 등록정보 첨부 여부는 상관하지 않겠습니다. 대신 양심껏 과제에 임해주시길…
systemC의 요소들 Clock Module Process Data type
프로세스 모듈의 기능을 모델링 Return value, argument가 없음 계층 구조를 가질 수 없음
프로세스 종류 SC_METHOD SC_THREAD SC_CTHREAD
SC_METHOD 지정된 정적 센서티비티에 의해서 해당 프로세스 수행 Combinational logic 기능을 모델링 할 때 적합 내부에 무한루프를 가질 수 없음 Suspend 시킬 수 없음 (wait() 함수 사용 할 수 없음) 모듈의 구축자(SC_CTOR)에서 프로세스를 등록할 때 지정된 정적 센서티비티의 신호들이 변할 때 마다 해당 프로세스를 수행한다. SC_METHOD는 다른 프로세스와는 다르게 독자적인 thread를 갖지 않는다. 즉, 센서티비티에 등록된 event가 발생하면 해당 프로세스가 함수로서 수행된다. 조합로직과 같이 내부상태를 유지하지 않는 기능을 모델링하는데 적합하다
SC_THREAD 지정된 정적 센스티비티에 의해서 해당 프로세스 수행 독자적인 쓰레드 형성 반드시 무한루프를 가져야함 반드시 하나 이상의 wait()함수가 있어야 한다. wait()를 만나면 센스티비티에 등록된 사건이 발생할 때까지 대기 SC_METHOD 프로세스는 함수를 수행하는 것이지만, SC_THREAD는 독자적인 thread를 형성 SC_METHOD와는 다르게 내부에 항상 무한루프를 갖고 있어야 한다. 프로세스 수행을 잠시 중지(suspend)시키는 함수가 반드시 하나 이상 있어야 한다. Wait() : 센서티비티에 등록된 사건이 발생할 때 까지 기다린다. Wait(event) : 프로세스 등록 때 지정된 정적 센서티비티를 일시적으로 무시하고 동적으로 센서티비티를 지정
SC_CTHREAD 정적 센스티비티로 클럭의 한쪽 모서리(edge)만을 사용할 수 있다. 독자적인 쓰레드 형성 반드시 무한루프를 가져야함 반드시 하나 이상의 wait()함수가 있어야 한다. wait()를 만나면 센스티비티에 등록된 클럭의 모서리가 발생할 때까지 대기 wait(n) : 센서티비티에 등록된 클럭의 모서리가 n번 발생할 때까지 기다린다. wait_until(expression) : 프로세스 등록 때 지정된 정적 센서티비티를 일시적으로 무시하고 동적으로 센서티비티를 지정할 때 사용 expression이 참이 될때까지 프로세스의 수행이 멈춘다. Expression은 불리안으로 계산되는 표현식.
Sensitivity 해당 프로세스를 기동 또는 수행하는 조건 정적 센스티비티 : 프로세스를 등록할 때 지정하는 것으로 컴파일 시점에 정해진다. Ex) stream style – sensitive << A << B; function style – sensitive(A); sensitive(B); 동적 센스티비티 : 프로세스가 수행되는 동안 변화시키는 것 센서티비티에 등록할 신호 또는 포트의 데이터타입이 bool인 경우 sensitive_pos 또는 sensitive_neg를 sensitive 대신 사용할 수 있다. 특히 SC_METHOD 프로세스의 경우 특정 모듈의 모든 입력을 정적 센서티비티로 지정하는 것이 바람직하다. 만약 일부 입력신호가 센서티비티에서 빠지면 입력이 변했는대도 출력이 변하지 않는 경우가 생길 수 있다.
프로세스 정리 SC_METHOD SC_THREAD SC_CTHREAD 기동트리거 Signal events Clock edge 무한 루프 NO YES 등록 형태 SC_METHOD(pro); sensitive(sig); sensitive_pos(sig); sensitive_neg(sig); SC_THREAD(pro); SC_CTHREAD(pro, clock.pos()); SC_CTHREAD(pro, clock.neg()); 정지와 복구 해당사항없음 wait(); wait(); wait(n); 동적센스티비티 Next_trigger(ev); wait(ev); 기타 wait_until(exp); watching(exp); - Pro : process, sig : signal, ev : event, exp : expression, n : 양수
실습 및 과제 프로세스 방식과 프로세스 기동 조건이 다른 5개의 adder 모듈을 만든다 각 adder의 기능은 input A와 B를 합하는 것 다음 실습시간에 제출
5개의 adder 1 -> 방식 : METHOD , Sensitivity : A,B 2 -> 방식 : THREAD , Sensitivity : clk(positive) 3 -> 방식 : THREAD , Sensitivity : A,B 4 -> 방식 : THREAD , Sensitivity : A,B, clk(positive) 5 -> 방식 : CTHREAD, Sensitivity : clk(positive)
adder * R_M * adder R_T1 stimulus * adder * R_T2 * adder A * R_T3 B * SC_METHOD R_M * adder SC_THREAD R_T1 stimulus * adder * SC_THREAD R_T2 * adder A * B SC_THREAD R_T3 * clk * adder SC_CTHREAD R_C clock(clk) *
7개의 파일 adder_method.h adder_thread1.h adder_thread2.h adder_thread3.h adder_cthread.h test.h main.cpp
adder_method.h
adder_method.h
adder_thread1.h
adder_thread1.h
adder_thread2.h
adder_thread2.h
adder_thread3.h
adder_thread3.h - sensitive << A << B << clk.pos(); 도 가능
adder_cthread.h
adder_cthread.h SC_CTHREAD(do_adder, clk.pos());
test.h wait() 는 프로세스의 수행을 잠시 멈추었다가 해당 모듈에서 지정한 센서티비티에 등록한 event (여기서는 clk) 가 발생할 때 상쇄된다. 상쇄된 이 후 그 다음 명령을 실행한다.
main.cpp
R_M과 R_T2 그리고 R_T3가 동일한 결과를 보이고 있고, R_T1과 R_C가 역시 동일한 결과를 보이고 있다. 서로 다른 프로세스 형식을 사용해도 같은 결과를 낼 수 있다는 것을 알 수 있다. R_M과 R_T2 그리고 R_T3는 조합로직과 같은 결과이고 R_T1과 R_C는 내부에 플립플롭이 있는 것과 같은 결과를 보인다