SystemC는 하드웨어 기술 언어입니다.
1. SC_THREAD
2.SC_CTHREAD
3. SC_METHOD
여러가지 장점과 단점이 있지만, 그런 부분에 대한 내용은 다른 자료를 참고하시면 됩니다.
공부하면서 정리하는 자료들입니다.
하드웨어와 일반 컴퓨터 언어의 가장 큰 차이점은 병렬성입니다.
일반 컴퓨터 언어는 순차적으로 프로그램이 진행되지만, 하드웨어 기술 언어는 일정 블럭 단위 혹은 라인단위로 병렬성을 가지고 실행합니다.
엄밀하게는 순차적으로 움직이지만, 잘 계산하여서 마치 병렬로 움직이는 것처럼 보이게 됩니다.
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 |