앞선 장에서 모듈간 통신을 위해 Interface/port/channel이 필요하다는 것을 배웠다. SystemC에서 제공하는 in/output port와 primitive channel을 이용하여 하드웨어 통신을 모델링할 수 있었다. 그러나 SystemC를 제대로 활용하기 위해서는 이것으론 부족하다. 기존의 RTL level 모델링은 Verilog/VHDL과 같은 HDL이 더 편리할 것이다.
진정 SystemC가 필요한 부분은 좀 더 high level의 모델링과 검증 분야이다. 나중에 이야기할 기회가 있겠지만 SCV(SystemC Verification Standard)와 같은 library로 검증 분야에서 SystemC는 훌륭한 기능을 발휘할 수 있게 되었다.그러면 high level modeling이나 검증을 위해 가장 많이 사용하는 사용자 정의 인터페이스/채널에 대해 알아보자. 모듈간의 통신을 신호 레벨이 아닌 좀 더 상위 수준 즉, Transaction Level에서 모델링 하기 위해서는 사용자가 전송할 데이터 타입을 정의하고 그 데이터를 읽고 쓰는 역할을 하는 채널을 만들어야 한다.
이 때 읽고/쓰는 함수를 실제 구현하는 것이 채널이고 그 가상함수를 정의하는 것이 인터페이스이다. 그리고 이 인터페이스를 모듈에서 사용할 수 있도록 연결하는 것이 포트이다.
예제를 하나 들어 보자 우선 어드레스와 데이터로 구성된 데이터 타입을 정의 하자.
typedef struct {
int addr;
int data;
} packet_t;
이 데이터 타입을 인자로 갖는 read()/write() 가상 함수를 정의하는 인터페이스는 아래와 같다.
class my_packet_if : public class sc_interface
{
public :
virtual void read(packet_t *rd_pkt) = 0;
virtual void write(packet_t *wr_pkt) = 0;
};
그리고 이 인터페이스를 구현 하는 채널은 아래와 같이 구현할 수 있다.
사용자 정의 채널은 sc_channel 클래스와 사용자 정의 인터페이스, 여기서는 my_packet_if를 상속 받는다.
class my_channel : public class sc_channel, public class my_packet_if
{
public :
packet_t my_data;
virtual void read(packet_t *rd_pkt)
{
rd_pkt->addr = my_data.addr;
rd_pkt->data = my_data.data;
return;
}
virtual void write(packet_t *wr_pkt)
{
my_data.addr = wr_pkt->addr;
my_data.data = wr_pkt->data;
return;
}
};
그리고 이 인터페이스를 인자로 갖는 포트는 아래와 같이 선언 할 수 있다.
sc_port<my_packet_if<packet_t>> my_port;
그러면 모듈 A와 B에 위의 port가 선언되어 있다고 하면 두 모듈은 아래와 같이 연결 할 수 있다.
my_channel u_my_chn;
A.my_port(u_my_chn);
B.my_port(u_my_chn);
A 모듈에서 packet을 write하려면 어떻게 할까? 아래에 예를 들어 본다
packet_t my_pkt;
my_pkt.addr = 0x1234;
my_pkt.data = 0xff;
my_port->write(&my_pkt);
그리고 B 모듈에서 packet을 read하려면 다음과 같을 것이다.
packet_t my_pkt;
my_port->read(&my_pkt);
cout << "Packet Address = " << my_pkt.addr << endl;
cout << "Packet Data = " << my_pkt.data << endl;
위와 같이 사용자가 잘 정의한 인터페이스로 상세 pin to pin 인터페이스 대신 추상화된 데이터 타입의 인터페이스를 사용함으로써 보다 상위 레벨의 전송 모델을 구현할 수 있는 것이다.
'SystemC Tutorial' 카테고리의 다른 글
Ch6. Process (0) | 2014.01.14 |
---|---|
Ch5. sc_export 사용하기 (0) | 2008.01.17 |
Ch3. SystemC의 구성 요소 - Primitive Channel (0) | 2007.11.10 |
Ch2. SystemC의 구성 요소 - 인터페이스,포트,채널 (0) | 2007.11.10 |
Ch1. SystemC의 구성요소 - module (0) | 2007.05.15 |