ASIC SoC2009. 8. 21. 12:22
SystemC는 하드웨어 기술 언어입니다.

여러가지 장점과 단점이 있지만, 그런 부분에 대한 내용은 다른 자료를 참고하시면 됩니다.
공부하면서 정리하는 자료들입니다.

하드웨어와 일반 컴퓨터 언어의 가장 큰 차이점은 병렬성입니다.
일반 컴퓨터 언어는 순차적으로 프로그램이 진행되지만, 하드웨어 기술 언어는 일정 블럭 단위 혹은 라인단위로 병렬성을 가지고 실행합니다.

엄밀하게는 순차적으로 움직이지만, 잘 계산하여서 마치 병렬로 움직이는 것처럼 보이게 됩니다.

SystemC는 하드웨어의 병렬성을 모델링 하기 위해서 process  모델로 운용을 합니다.
시뮬레이션 커널은 이 프로세스 모델을 크게 나누어 아래와 같이 3가지 형태로 구분됩니다.

1. SC_THREAD


SC_THREAD(process_name);

SystemC 커널에 process_name 이라는 프로세스 함수를 SC_THREAD 형식으로 등록을 시킵니다.
이것은 시뮬레이션 커널에게 ,  THREAD 형태로 등록되도록 하여 주면, 이후 시뮬레이션이 시작되면 적당한 방법으로 실행하게 됩니다.

다만 다른 프로세스 모델과 틀린점은  아래와 같습니다.
 - 시뮬레이터에서 단 한번만 호출됩니다.
   따라서 지속적으로 운용하고 싶다면, 무한 루프를 만들어서 운용해야 합니다.
 - 함수로서 주고 받는 파라미터가 없습니다.
    즉 전달하는 파라미터나 리턴되는 값이 없이 함수 자체로만 존재합니다.
    이는 시뮬레이션 커널이 해당 쓰레드를 위한 함수를 등록하고 호출하기 위한 매커니즘을 단순하게 하기 위해서 준비된 규칙입니다.

SC_MODULE(onemethod) {
   sc_in<bool> in;
   sc_out<bool> out;

   void toggler(); /* Process a method of the class */

   SC_CTOR(onemethod) {
        SC_THREAD(toggler) ; /* Create an instance of the process */
        sensitive << in ;        /* Sensitive 리스트 */
   }
};

void onemethod::toggler() {
bool last = false;
for(;;) {
last = in ; out = last ; wait();
last = in ; out = last ; wait();
}
}


 2.SC_CTHREAD


 
SC_CTHREAD(process_name,clockname);
 
 SC_THREAD를 조금 확장한 버전입니다. C가 의미하는 것은 Clock을 의미합니다.
 즉 THREAD 버전은 한번만 호출된다는 것을 특징으로 하지만
 SC_CTHREAD로 등록되는 프로세스는 Clock의 이벤트 마다 호출된다는 점을 특징으로 합니다.

SC_MODULE(onemethod) {
   sc_in_clk clock;
   sc_in<bool> trigger,  in;
   sc_out<bool> out;

   void toggler(); /* Process a method of the class */

   SC_CTOR(onemethod) {
        SC_CTHREAD(toggler,clock.pos()) ; /* 사용할 클럭 에지와 함께 선언됩니다.*/
   }
};

void onemethod::toggler() {
bool last = false;
for ( ;; ) {
wait_until (trigger.delayed == true ) ;
last = in ; out = last ;
wait();
last = in ; out = last ;
wait();
}
}

 3. SC_METHOD


  SC_METHOD(process_name);

 Sensitive list에 등록된 인자들이 변할때 마다 호출됩니다. 하지만, 매 호출될때 마다 내부 값들이 보존되지 않고 새로 할당됩니다.

앞서의 2개의 프로세서와의 가장 큰 차이점은 내부에서 wait()를 쓸 수 없다는 점입니다.

SC_MODULE(onemethod) {
sc_in <bool> in;
sc_out <bool> out ;
void inverter ();

SC_CTOR(onemethod) {
SC_METHOD(inverter);
sensitive << in ;
}
};

void onemethod:: inverter()
{
bool internal;
internal = in;
out       = internal;
}

'ASIC SoC' 카테고리의 다른 글

SystemC : Thread 2nd  (0) 2009.08.26
GTKWave 를 OSX에서 구동하기  (0) 2009.08.24
Sound Engine Processor  (0) 2009.08.18
맥에서 SystemC 하기  (0) 2009.08.10
[5] 가장 작은 32비트 프로세서 ZPU 입니다  (0) 2009.07.28
Posted by GUNDAM_IM