Process 는 SytemC에서 기본적인 실행 단위 이다. SystemC에서 Proecess는 아래 3가지 종류가 있다.
* Method
* Thread
* Clock Thread
각 preocess는 공히 sensitivity list라는 것을 갖는데, sensitivity list에 기술된 signal에 event가 발생할 때 process가 실행된다. 여기서 evnet라 함은 signal의 value가 바뀌는 것을 말한다.
1. Method
Method는 sensitivity list 에 기술된 signal의 event가 발생할 경우 시작하고 순차적으로 실행된 후에 simulation kernel로 return한다.
example)
#include "systemc.h"
SC_MODULE(my_mod) {
public :
sc_in<int> in;
sc_out<int> out;
void my_method();
SC_CTOR(my_mod) {
SC_METHOD(my_method);
sensitive << in;
}
};
void my_mod::my_method() {
int input;
int output;
input = in;
output = input + 1;
out = output;
cout << "Time : " << sc_time_stamp().to_string().c_str() << " In = " << input << ", Out = " << output << endl;
}
int sc_main (int, char *[]) {
sc_signal<int> A;
sc_signal<int> Y;
my_mod test("test");
test.in(A);
test.out(Y);
A = 0;
sc_start(5, SC_NS);
A = 2;
sc_start(5, SC_NS);
A = 5;
sc_start(5, SC_NS);
return 0;
}
위의 예제에서 my_mod의 instance인 test는 in port에 A signal이 연결되어 있다. 따라서 A값이 바뀔 때 마다 my_method()함수가 실행되는 것이다. 아래는 위의 코드를 컴파일 하고 실행한 출력 화면이다.
A의 초기 값을 0으로 설정하고 5ns 마다 A값을 바꿔 주기 때문에 A값의 변화에 따라 my_method()함수가 실행되어 입력 A에 1이 더해진 값이 출력된다. sc_start(5, SC_NS) 는 5ns만큼 simulation을 진행시킨다는 의미이다.
2. Thread
Thread는 Method와 동일하나 code사이에 wait()문을 사용할 수 있다. wait()에 다양한 event를 인자로 줄 수 있으므로 daynamic sensitive기능이 가능하다.
example)
아래 코드에서는 method와는 다르게 clock을 선언하여 사용하고 있다. 일단 my_mod에 clock port를 선언하였는데 이는 다음과 같이 선언한다.
sc_in_clk clk;
sc_in_clk는 clock type의 input port를 가르키는 것이도 clk는 clock 이름이다.
constructor에서 my_thread()함수를 SC_THREAD macro를 이용하여 thread로 선언해준다. 그리고 sensitive event로 clk.pos()함수를 지정해 준다. 이는 wait()함수에서 'clk' clock의 positive edge 가 발생할 때 까지 기다린다는 의미이다. thread 에서는 보통 while(1)과 같은 무한 loop안에서 필요한 기능을 수행하고 이 loop안에 최소한 하나의 wait() 함수를 호출해야 한다.
sc_main() 함수 안에서 아래와 같이 clock을 선언해 준다.
sc_clock clk("clock", 5, SC_NS, 0.5, 0.0, SC_NS, true);
각 parameter 의 의미는 아래와 같다.
parameter | 설명 |
"clock" | 이름 |
5 | 주기 |
SC_NS | 주기의 타임 단위 , nano second |
0.5 | duty cycle, 50% (0 ~ 1 사이 값) |
0.0 | 시작 delay |
SC_NS | 시작 delay의 타임 단위 |
true | 처음 만나는 edge type, true : positive edge, false : negative edge |
#include "systemc.h"
SC_MODULE(my_mod) {
public :
sc_in_clk clk;
sc_in<int> in;
sc_out<int> out;
void my_thread();
SC_CTOR(my_mod) {
SC_THREAD(my_thread);
sensitive << clk.pos();
}
};
void my_mod::my_thread() {
int input;
int output;
while (1)
{
wait();
input = in;
output = input + 1;
out = output;
cout << "Time : " << sc_time_stamp().to_string().c_str() << " In = " << input << ", Out = " << output << endl;
}
}
int sc_main (int, char *[]) {
sc_clock clk("clock", 5, SC_NS, 0.5, 0.0, SC_NS, true);
sc_signal<int> A;
sc_signal<int> Y;
my_mod test("test");
test.clk(clk);
test.in(A);
test.out(Y);
A = 0;
sc_start(5, SC_NS);
A = 2;
sc_start(5, SC_NS);
A = 5;
sc_start(5, SC_NS);
return 0;
}
아래는 위의 코드를 실행한 화면이다.
3. Clock Thread
Clock trehad는 thread의 특수한 형태이다. Clock thread는 clock의 edge에서만 trigger되며 hardware flip-flop의 특성을 기술하는데 유용하다.
Sensitivity list를 따로 기술하지 않고 SC_THREAD의 두번째 인자로 기술한다.
example)
#include "systemc.h"
SC_MODULE(my_mod) {
public :
sc_in_clk clk;
sc_in<int> in;
sc_out<int> out;
void my_thread();
SC_CTOR(my_mod) {
SC_CTHREAD(my_thread, clk.pos());
}
};
void my_mod::my_thread() {
int input;
int output;
while (1)
{
wait();
input = in;
output = input + 1;
out = output;
cout << "Time : " << sc_time_stamp().to_string().c_str() << " In = " << input << ", Out = " << output << endl;
}
}
int sc_main (int, char *[]) {
sc_clock clk("clock", 5, SC_NS, 0.5, 0.0, SC_NS, true);
sc_signal<int> A;
sc_signal<int> Y;
my_mod test("test");
test.clk(clk);
test.in(A);
test.out(Y);
A = 0;
sc_start(5, SC_NS);
A = 2;
sc_start(5, SC_NS);
A = 5;
sc_start(5, SC_NS);
return 0;
}
아래는 위의 코드를 컴파일 하고 실행 시킨 화면이다. 이 경우에 위와는 다르게 time이 5ns 부터 표시되었는데 이는 systemc kernel에서 clock의 첫번째 positive edge를 5ns 부터 인식했기 때문이다. simulation time 0에서 clock의 edge를 positive로 볼 수도 있고 안 볼 수도 있는데 이는 simulator마다 구현 방식에 따라 차이가 날 수 있음을 유의해야 한다.
'SystemC Tutorial' 카테고리의 다른 글
Ch5. sc_export 사용하기 (0) | 2008.01.17 |
---|---|
Ch4. SystemC 활용하기 - 사용자 정의 인터페이스/채널 (2) | 2007.11.10 |
Ch3. SystemC의 구성 요소 - Primitive Channel (0) | 2007.11.10 |
Ch2. SystemC의 구성 요소 - 인터페이스,포트,채널 (0) | 2007.11.10 |
Ch1. SystemC의 구성요소 - module (0) | 2007.05.15 |