SystemC는 C++을 사용한 하드웨어 모델링을 위한 무료 라이브러리입니다. 처음에는 OSCI(Open SystemC Initiative)에 의해 홍보되었고, 현재는 Accellera에서 제공되며 IEEE-1666 표준으로 지정되어 있습니다. 각 하드웨어 구성 요소는 하위 구성 요소를 포함할 수 있는 C++ 클래스에 의해 정의됩니다. SystemC는 TLM(Transaction Level Modelling)과 net-level 모델링의 혼합을 지원하며, 시뮬레이션 및 합성(synthesis)에도 사용할 수 있습니다. 원래는 C++ 내에서 디지털 로직을 표현하기 위한 RTL-equivalent 방법으로 설계되었습니다.
SystemC 핵심 라이브러리의 주요 요소:
- 모듈 시스템 및 inter-module 채널: C++ 클래스 인스턴스는 회로 구성 요소 구조에 따라 계층적으로 인스턴스화됩니다. 이는 RTL 모듈이 서로 인스턴스화되는 방식과 유사합니다.
- 유저 스페이스에서 실행되는 커널: 이 커널은 시스템 시간, 시뮬레이션 일시 정지, 이름 해석 기능을 제공합니다. VHDL의 상세한 의미론을 대략적으로 따르는 EDS(Event-Driven Simulation) 이벤트 큐를 구현하며, 이벤트 알림과 쓰레드를 제공합니다. 이 쓰레드들은 선점형(preemptive)이 아니므로, 데이터 구조 잠금에 대해 경량 접근 방식을 사용할 수 있지만, 다중 코어 워크스테이션에서 SystemC를 실행할 때 문제가 발생할 수 있습니다.
- compute/commit 신호 패러다임: 이 패러다임은 zero-delay 모델의 클럭 도메인에서 shoot-through 현상을 피하기 위해 필요합니다. 이 현상은 하나의 flip-flop이 이전 값을 읽기 전에 다른 flip-flop이 출력을 변경할 때 발생합니다.
- 임의의 고정 소수점 정수 라이브러리: 하드웨어는 다양한 너비의 버스와 카운터를 사용하는데, SystemC는 이와 동일하게 동작하는 다양한 너비의 부호 있는(signed) 및 부호 없는(unsigned) 변수를 제공합니다.
- 파형 출력 기능: 파형을 파일에 캡처하고, 이를 gtkwave와 같은 표준 파형 뷰어 프로그램에서 볼 수 있도록 합니다.
SystemC의 문제점:
- Reflection API 부족: C++에는 Python과 같은 reflection API가 없기 때문에, 런타임 오류 보고나 기타 정적 분석(static analysis)을 수행하는 것이 어렵습니다. 이를 극복하기 위해, SystemC 코딩 시 구조를 문자열로 주석 처리해야 하는 경우가 있지만, C 전처리기를 사용해 식별자의 중복 입력을 최소화할 수 있습니다.
- C++ 전문성 부족: 하드웨어 엔지니어들이 C++에 익숙하지 않은 경우가 많아, 라이브러리를 잘못 사용하면 복잡하고 난해한 C++ 오류 메시지를 접할 수 있습니다.
SystemC의 주요 장점:
- 뛰어난 성능: C++로 코딩된 것은 본질적으로 매우 뛰어난 성능을 제공합니다.
- 산업 표준: SystemC는 전자 설계 자동화(EDA) 산업에서 채택된 표준입니다. 애플리케이션 코드와 디바이스 드라이버를 포함한 일반적인 동작 코드가 이 공통 언어로 모델링 및 구현됩니다.
SystemC는 SC_MODULE 및 SC_CTOR 매크로를 사용해 컴포넌트를 정의할 수 있습니다. 예를 들어, 바이너리 카운터를 SC_MODULE로 정의하고, SC_CTOR를 사용해 생성자를 만듭니다. SC_METHOD를 사용해 클럭 엣지마다 호출되는 동작을 정의할 수 있습니다. 예제는 10비트 바이너리 카운터를 SystemC 클래스 모듈로 코딩한 것입니다.

SystemC 구조적 netlist
SystemC에서 templated 채널은 컴포넌트 간의 일반적인 인터페이스입니다. sc_in, sc_out, sc_signal과 같은 파생 형태를 주로 사용합니다. 이들은 delta 사이클을 위해 compute/commit 패러다임을 구현하여, zero-delay 모델에서의 레이싱 불확실성을 피합니다.

SystemC 쓰레드와 메소드
SystemC는 사용자가 모듈에 자신의 쓰레드와 스택을 가질 수 있도록 합니다. 메모리 풋프린트가 적으므로, non-blocking upcalls만 사용하는 trampoline 스타일로 작동하는 것이 바람직합니다. 효율성을 위해, SC_METHOD를 가능한 한 자주 사용하고, SC_THREAD는 프로그램 카운터에 중요한 상태를 유지해야 할 때나 비동기적(active) 동작이 필요할 때 사용해야 합니다.
SystemC Plotting 및 GUI
SystemC는 파형을 Verilog Change Dump (VCD) 파일에 덤프해 나중에 gtkwave나 ModelSim 등의 시각화 도구로 볼 수 있도록 지원합니다. VCD 파일은 net 이름과 이들의 값 변화 목록을 타임스탬프와 함께 저장합니다.
더 큰 모델링 효율성을 향하여
SystemC 채널을 통해 커널 작업당 더 많은 데이터를 전달하는 접근 방식은 더 큰 모델링 효율성을 제공합니다. 예를 들어, capsule 구조체를 정의하고, 이를 통해 두 개의 정수를 한 번에 전송할 수 있습니다. 이는 트랜잭션 모델링의 한 걸음입니다.
이처럼 SystemC는 하드웨어 설계와 모델링에 유용한 도구이며, C++의 강력한 기능을 활용해 다양한 모델링과 시뮬레이션 요구사항을 충족할 수 있습니다. 그러나 C++에 대한 깊은 이해가 필요하며, 이를 효과적으로 사용하기 위해서는 숙련된 엔지니어링 지식이 필요합니다.
'IT' 카테고리의 다른 글
| [ESL Modeling 5] Transaction-level Modelling (2) (0) | 2024.08.29 |
|---|---|
| [ESL Modeling 4] Transaction-level Modelling (1) (2) | 2024.08.29 |
| [ESL Modeling 2] Interconnect Modelling (1) | 2024.08.29 |
| [ESL Modeling 1] Modeling Abstractions (0) | 2024.08.29 |
| Electronic System-Level (ESL) Modeling _ Introduction (2) | 2024.08.29 |