본문 바로가기

SystemC Tutorial

Ch6. Process

반응형

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마다 구현 방식에 따라 차이가 날 수 있음을 유의해야 한다.

반응형