SystemCは、イベント駆動型シミュレーションインターフェースを提供するC++クラスとマクロのセットです(離散イベントシミュレーションも参照)。これらの機能により、設計者は、それぞれがプレーンなC++構文で記述された並行プロセスをシミュレートできます。SystemCプロセスは、C++が提供するすべてのデータ型、SystemCライブラリが提供する追加のデータ型、およびユーザー定義の信号を使用して、シミュレートされたリアルタイム環境で通信できます。SystemCは、ある意味でハードウェア記述言語であるVHDLとVerilogを意図的に模倣していますが、より適切にはシステムレベルのモデリング言語と表現できます。
SystemCは、システムレベルモデリング、アーキテクチャ探索、パフォーマンスモデリング、ソフトウェア開発、機能検証、および高位合成に適用されます。SystemCは、電子システムレベル(ESL)設計やトランザクションレベルモデリング(TLM)と密接に関連しています。
SystemC は Open SystemC Initiative (OSCI - 現在はAccellera ) によって定義および推進されており、IEEE Standards Association によって IEEE 1666-2011 [ 1 ] - SystemC 言語リファレンス マニュアル (LRM) として承認されています。LRM は SystemC のセマンティクスの決定的な記述を提供します。OSCI はまた、オープンソースの概念実証シミュレータ (参照シミュレータと誤って呼ばれることもあります) を提供しており、これは OSCI の Web サイトからダウンロードできます。[ 2 ] OSCI の意図は、商用ベンダーと学術機関が IEEE 1666 に準拠した独自のソフトウェアを作成できるようにすることでしたが、実際にはほとんどの SystemC 実装は、少なくとも部分的には OSCI の概念実証シミュレータに基づいています。
SystemCは、意味的にはVHDLやVerilogと類似していますが、ハードウェア記述言語として使用する場合、これらの言語に比べて構文上のオーバーヘッドが大きいと言えます。一方で、オブジェクト指向設計のパーティショニングやテンプレートクラスと同様に、より幅広い表現が可能です。厳密にはC++クラスライブラリですが、SystemCは独立した言語として扱われることもあります。ソースコードは、SystemCライブラリ(シミュレーションカーネルを含む)を使用してコンパイルすることで実行可能ファイルを作成できます。OSCIオープンソース実装のパフォーマンスは、レジスタ転送レベルのシミュレーションに使用する場合、一般的に商用のVHDL/Verilogシミュレータよりも劣ります。
SystemCバージョン1には、構造階層と接続性、クロックサイクル精度、デルタサイクル、4値論理(0、1、X、Z)、バス解決関数など、一般的なハードウェア記述言語の機能が含まれていました。
SystemC バージョン 2 以降では、通信の抽象化、トランザクション レベルのモデリング、仮想プラットフォーム モデリングに重点が置かれました。また、抽象ポート、動的プロセス、および時間指定イベント通知も追加されました。
SystemCには、モジュールと呼ばれるコンテナクラスの概念があります。これは階層構造を持つ実体であり、内部に他のモジュールやプロセスを含めることができます。
モジュールは、SystemC設計階層の基本的な構成要素です。SystemCモデルは通常、ポートを介して通信する複数のモジュールで構成されます。モジュールは、SystemCの構成要素と考えることができます。
ポートは、チャネルを介してモジュール内部から外部(通常は他のモジュール)への通信を可能にする。
SystemCは、解決済み信号と未解決信号をサポートしています。解決済み信号は複数のドライバ(バス)を持つことができますが、未解決信号は1つのドライバしか持つことができません。
モジュールには、他のモジュールと接続するためのポートがあります。SystemCは、単方向ポートと双方向ポートをサポートしています。
エクスポート機能はチャネルを組み込み、モジュール内部から外部(通常は他のモジュール)への通信を可能にする。
プロセスは、機能を記述するために使用されます。プロセスはモジュール内に含まれています。SystemCは、ハードウェアおよびソフトウェア設計者が使用できる3つの異なるプロセス抽象化を提供します。プロセスは主要な計算要素であり、並行処理が可能です。
チャネルはSystemCにおける通信要素です。チャネルは単純な配線の場合もあれば、FIFOやバスチャネルのような複雑な通信メカニズムの場合もあります。
基本的なチャンネル:
ポートはインターフェースを使用してチャネルと通信します。
イベントはプロセス間の同期を可能にするものであり、初期化時に定義する必要があります。
SystemCは、ハードウェアのモデリングをサポートするいくつかのデータ型を導入しています。
拡張標準タイプ:
sc_int<n>nビット符号付き整数sc_uint<n>nビット符号なし整数sc_bigint<n>n > 64の場合のnビット符号付き整数sc_biguint<n>n > 64 の場合のnビット符号なし整数論理タイプ:
sc_bit 2値単一ビットsc_logic 4値1ビットsc_bv<n>sc_bit の長さn のベクトルsc_lv<n>sc_logic の長さn のベクトル固定小数点の種類:
sc_fixed<> テンプレート化された符号付き固定小数点sc_ufixed<> テンプレート化された符号なし固定小数点sc_fix テンプレートなしの符号付き固定小数点sc_ufix テンプレートなし符号なし固定小数点SystemC の起源は、DAC 1997 の論文で説明されている Scenic プログラミング言語の研究に遡ります。[ 4 ]
ARM Ltd.、CoWare、Synopsys、CynAppsはSystemC(CynAppsは後にForte Design Systemsとなった)の開発で協力し、1999年に最初のドラフト版をリリースした。[ 5 ] [ 6 ] 当時の主な競合相手は、UC Irvineの職員と日本の企業によって開発された、C言語ベースの別のオープンソースパッケージであるSpecCだった。
2000年6月、 SystemC関連の活動を主催する業界中立的な組織を提供し、Synopsysの最大の競合企業であるCadenceとMentor GraphicsがSystemC開発において民主的な代表権を得られるようにするため、Open SystemC Initiativeとして知られる標準化団体が設立された。
加算器のサンプルコード:
#include "systemc.h"SC_MODULE ( adder ) // モジュール (クラス) 宣言{ sc_in < int > a , b ; // ポートsc_out < int > sum ;void do_add ( ) // 処理{ sum.write ( a.read ( ) + b.read ( ) ) ; // または単に sum = a + b }SC_CTOR ( adder ) // コンストラクタ{ SC_METHOD ( do_add ); // do_add をカーネルに登録sensitive << a << b ; // do_add の感度リスト} };SystemCでは、シミュレーションによって電力とエネルギーの推定を行うことができます。Powersim [ 7 ]は、システムレベルで記述されたハードウェアの電力とエネルギー消費量を計算することを目的としたSystemCクラスライブラリです。この目的のために、C++演算子が監視され、SystemCの各データ型に対して異なるエネルギーモデルを使用できます。Powersimを使用したシミュレーションでは、アプリケーションのソースコードを変更する必要はありません。