SystemC

**SystemC**는 C++ 클래스 및 매크로 세트로, 사건 기반 시뮬레이션 인터페이스를 제공한다(또한 이산 사건 시뮬레이션 참조). 이러한 기능을 통해 설계자는 일반 C++ 구문을 사용하여 설명된 동시적 프로세스를 시뮬레이션할 수 있다. SystemC 프로세스는 시뮬레이션된 실시간 환경에서 C++가 제공하는 모든 자료형과 SystemC 라이브러리가 제공하는 추가 데이터 유형은 물론 사용자 정의 데이터 유형의 신호를 사용하여 통신할 수 있다. 어떤 면에서 SystemC는 하드웨어 기술 언어인 VHDL 및 베릴로그를 의도적으로 모방하지만, 시스템 수준 모델링 언어로 더 적합하게 설명된다.

SystemC는 시스템 수준 모델링, 아키텍처 탐색, 성능 모델링, 소프트웨어 개발, 기능 검증, 상위 수준 합성에 적용된다. SystemC는 종종 전자 시스템 수준 (ESL) 설계 및 트랜잭션 수준 모델링 (TLM)과 관련이 있다.

## 언어 사양
SystemC는 Open SystemC Initiative (OSCI — 현재 Accellera)에 의해 정의되고 홍보되었으며, IEEE 표준 협회에 의해 IEEE 1666-2011 – SystemC 언어 참조 설명서(LRM)로 승인되었다. LRM은 SystemC의 의미론에 대한 명확한 설명을 제공한다. OSCI는 또한 오픈 소스 개념 증명 시뮬레이터(때때로 참조 시뮬레이터로 잘못 언급되기도 함)를 제공하며, 이는 OSCI 웹사이트에서 다운로드할 수 있다. OSCI의 의도는 상업 공급업체와 학계가 IEEE 1666을 준수하는 독창적인 소프트웨어를 만들 수 있도록 하는 것이었지만, 실제로 대부분의 SystemC 구현은 적어도 부분적으로 OSCI 개념 증명 시뮬레이터를 기반으로 했다.

### HDL과의 비교
SystemC는 VHDL 및 베릴로그와 의미론적 유사성을 가지지만, 하드웨어 기술 언어로 사용될 때 이들에 비해 구문적 오버헤드가 있다고 할 수 있다. 반면에, 객체 지향 설계 분할 및 템플릿 클래스와 유사하게 더 넓은 범위의 표현을 제공한다. 엄격히 C++ 클래스 라이브러리임에도 불구하고, SystemC는 때때로 그 자체의 언어로 간주되기도 한다. 소스 코드는 SystemC 라이브러리(시뮬레이션 커널 포함)와 함께 컴파일되어 실행 파일을 생성한다. OSCI 오픈 소스 구현의 성능은 레지스터 전송 레벨 시뮬레이션에 사용될 때 일반적으로 상업용 VHDL/베릴로그 시뮬레이터보다 좋지 않다.

### 버전
SystemC 버전 1에는 구조적 계층 및 연결성, 클록 사이클 정확도, 델타 사이클, 사값 논리 (0, 1, X, Z), 버스 해결 기능과 같은 일반적인 하드웨어 기술 언어 기능이 포함되었다.

SystemC 버전 2부터는 통신 추상화, 트랜잭션 수준 모델링, 가상 플랫폼 모델링에 중점을 두었다. 또한 추상 포트, 동적 프로세스, 시간 지정 이벤트 알림 기능이 추가되었다.

## 언어 기능

### 모듈
SystemC에는 모듈이라는 컨테이너 클래스의 개념이 있다. 이것은 다른 모듈이나 프로세스를 포함할 수 있는 계층적 개체이다.

모듈은 SystemC 설계 계층 구조의 기본 구성 요소이다. SystemC 모델은 일반적으로 포트를 통해 통신하는 여러 모듈로 구성된다. 모듈은 SystemC의 빌딩 블록으로 생각할 수 있다.

### 포트
포트는 채널을 통해 모듈 내부에서 외부(일반적으로 다른 모듈로)로 통신을 허용한다.

### 신호
SystemC는 해결된 신호와 해결되지 않은 신호를 지원한다. 해결된 신호는 둘 이상의 드라이버(버스)를 가질 수 있지만 해결되지 않은 신호는 하나의 드라이버만 가질 수 있다.

### 익스포트
모듈은 다른 모듈에 연결되는 포트를 가지고 있다. SystemC는 단방향 및 양방향 포트를 지원한다.

익스포트는 채널을 통합하여 모듈 내부에서 외부(일반적으로 다른 모듈로)로 통신을 허용한다.

### 프로세스
프로세스는 기능을 설명하는 데 사용된다. 프로세스는 모듈 안에 포함된다. SystemC는 하드웨어 및 소프트웨어 설계자가 사용할 수 있는 세 가지 다른 프로세스 추상화를 제공한다. 프로세스는 주요 계산 요소이다. 이들은 동시적이다.

### 채널
채널은 SystemC의 통신 요소이다. 이들은 단순한 와이어일 수도 있고 FIFO나 버스 채널과 같은 복잡한 통신 메커니즘일 수도 있다.

기본 채널:
* signal: 와이어에 해당
* buffer
* fifo
* mutex
* semaphore

### 인터페이스
포트는 인터페이스를 사용하여 채널과 통신한다.

### 이벤트
이벤트는 프로세스 간의 동기화를 허용하며 초기화 중에 정의되어야 한다.

### 데이터 유형
SystemC는 하드웨어 모델링을 지원하는 여러 데이터 유형을 도입한다.

확장 표준 유형:
*       n비트 부호 있는 정수
*       n비트 부호 없는 정수
*     n > 64인 n비트 부호 있는 정수
*    n > 64인 n비트 부호 없는 정수

논리 유형:
*          2값 단일 비트
*        4값 단일 비트
*         sc_bit의 길이 n 벡터
*         sc_logic의 길이 n 벡터

고정 소수점 유형:
*      템플릿화된 부호 있는 고정 소수점
*     템플릿화된 부호 없는 고정 소수점
*          템플릿화되지 않은 부호 있는 고정 소수점
*         템플릿화되지 않은 부호 없는 고정 소수점

## 역사
* 1999-09-27 Open SystemC Initiative 발표
* 2000-03-01 SystemC V0.91 출시
* 2000-03-28 SystemC V1.0 출시
* 2001-02-01 SystemC V2.0 사양 및 V1.2 베타 소스 코드 출시
* 2003-06-03 SystemC 2.0.1 LRM(언어 참조 설명서) 출시
* 2005-06-06 SystemC 2.1 LRM 및 TLM 1.0 트랜잭션 수준 모델링 표준 출시
* 2005-12-12 IEEE, SystemC용 IEEE 1666–2005 표준 승인
* 2007-04-13 SystemC v2.2 출시
* 2008-06-09 TLM-2.0.0 라이브러리 출시
* 2009-07-27 TLM-2.0 LRM 출시, TLM-2.0.1 라이브러리 동반
* 2010-03-08 SystemC AMS 확장 1.0 LRM 출시
* 2011-11-10 IEEE, SystemC용 IEEE 1666–2011 표준 승인
* 2016-04-06 IEEE, SystemC AMS용 IEEE 1666.1–2016 표준 승인
* 2023-06-05 IEEE, IEEE 1666–2023 표준 승인

SystemC는 1997년 DAC 논문에서 설명된 Scenic 프로그래밍 언어 작업에서 유래한다.

ARM Ltd., CoWare, 시높시스 및 CynApps는 SystemC를 개발하기 위해 협력하여 1999년에 첫 번째 초안 버전을 출시했다 (CynApps는 나중에 Forte Design Systems가 되었다). 당시 주요 경쟁자는 UC 어바인 직원과 일부 일본 기업이 개발한 또 다른 C 기반 오픈 소스 패키지인 SpecC였다.

2000년 6월, Open SystemC Initiative라는 표준 그룹이 결성되어 SystemC 활동을 주최하고 시높시스의 가장 큰 경쟁자인 케이던스와 멘토 그래픽스가 SystemC 개발에 민주적인 대표권을 가질 수 있도록 산업 중립적인 조직을 제공했다.

## 예시 코드
가산기의 예시 코드:

```cpp
#include "systemc.h"

SC_MODULE(adder)          // module (class) declaration
{
  sc_in<int> a, b;        // ports
  sc_out<int> sum;

  void do_add()           // process
  {
    sum.write(a.read() + b.read()); //or just sum = a + b
  }

  SC_CTOR(adder)          // constructor
  {
    SC_METHOD(do_add);    // register do_add to kernel
    sensitive << a << b;  // sensitivity list of do_add
  }
};
```


## SystemC에서의 전력 및 에너지 추정
SystemC에서는 시뮬레이션을 통해 전력 및 에너지 추정이 가능하다.
Powersim은 시스템 수준에서 설명된 하드웨어의 전력 및 에너지 소비를 계산하기 위한 SystemC 클래스 라이브러리이다. 이를 위해 C++ 연산자를 모니터링하고 각 SystemC 데이터 유형에 대해 다른 에너지 모델을 사용할 수 있다.
Powersim을 사용한 시뮬레이션은 애플리케이션 소스 코드 변경을 필요로 하지 않는다.

## 같이 보기
* Accellera
* Chisel
* SpecC
* SystemRDL
* 시스템베릴로그
* 가상 머신

## 내용주

## 각주
* 
* 
* T. 그뢰트커, S. 랴오, G. 마르틴, S. 스완, System Design with SystemC. 스프링어, 2002. 
* A SystemC based Linux Live CD with C++/SystemC tutorial
* J. 바스커, A SystemC Primer, 2판, 스타 갤럭시 퍼블리싱, 2004. 
* D. C. 블랙, J. 도노번, SystemC: From the Ground Up, 2판, 스프링어 2009. 
* 조지 프레이저, SystemC: Hardware-Oriented Constructs in C++
* 프랭크 게나시아 (편집자), Transaction-Level Modeling with SystemC: TLM Concepts and Applications for Embedded Systems, 스프링어 2006. 
* 스탠 Y. 랴오, 스티븐 W. K. 짱, 라제시 K. 굽타: An Efficient Implementation of Reactivity for Modeling Hardware in the Scenic Design Environment. DAC 1997: 70-75

## 외부 링크
*
* SystemC 튜토리얼
* ESCUG - 유럽 SystemC 사용자 그룹
* NASCUG - 북미 SystemC 사용자 그룹
* LASCUG - 라틴 아메리카 SystemC 사용자 그룹
* ISCUG - 인도 SystemC 사용자 그룹
* EDA Playground - 무료 웹 브라우저 기반 C++/SystemC IDE

분류:하드웨어 기술 언어
분류:C++ 프로그래밍 언어 계열