SystemC
SystemC(システムシー)は、電子回路機器の機能設計への使用を目的としたハードウェア記述言語 (HDL) の一種である。SystemC登場以前より存在し、純然たるHDLであるVerilogやVHDLに比べ、動作レベルモデリングなど、よりシステムよりの記述言語としての性格が強くなっている。
SystemCは、プログラム言語であるC++のクラスライブラリとして提供されており、それ自体言語として独立した文法を持つものではない。ライブラリにはハードウェア記述の為の機能、すなわち並列実行の概念やデータ型、それを扱う各種関数が定義されている。それを使って書かれたプログラムは通常のC++コンパイラでコンパイルすることができ、結果生成されたオブジェクトはハードウェアのシミュレータとして動作する。
言語としては、VerilogやVHDLと類似点も持つが、それは重要なことではない。重要なのは相違点のほうである。すなわちC++に由来するオブジェクト指向やテンプレート、動的なメモリー割り当てなどを使った自由度が大きく、抽象度の高い記述が可能なことである。ただしより自由に、抽象的に記述したものを実際のハードウェア化するのはより困難なことであり、論理合成ツールの能力に依存することになる。現状ではVerilogやVHDLで論理合成可能なレベルまでの具体化は人手による介在が必要である。それではメリットがないとも思えるが、仕様あるいは、あるアルゴリズムを最初は純然たるソフトウェアとして記述、デバッグ、その後順次ハードウェアに変換していくということがC++という同じ枠内でできるということに意味があるということである。
SystemCは複数のEDAベンダーや大学などの研究機関により提案され仕様が策定されている。2005年時点でのバージョンは2.1、さらに2007年3月には、バージョン2.2がリリースされた。 現在はトランザクションレベル・モデルライブラリの検討が進められている。
目次
言語要素
モジュール
モジュールはSystemCによる設計の階層中で基本となるブロックである。SystemCのモデルでは、ポート(次項)を通じて通信する複数のモジュールから構成される。
ポート
ポートは、モジュール内部と外部とを接続する端子である。通常は別のモジュールのポートに接続される。
プロセス
プロセスは、メインとなる処理要素である。個々のプロセスは同時、並列に実行される。
チャネル
チャネルは通信の要素であり、単純な配線のこともあれば、FIFOのような複雑なメカニズムのこともある。
基本チャネル:
インターフェイス
ポートはチャネルとの通信にインターフェイスを使用する。
イベント
プロセス間の同期を取るために用いる。
データタイプ(型)
SystemCはモデリングを支援するいくつかのデータタイプを用意している。
C++標準の型を拡張したもの:
- sc_int<> 64-bitまでの符号付整数
- sc_uint<> 64-bitまでの符号無整数
- sc_bigint<> 可変精度符号付整数 (※1)
- sc_biguint<> 可変精度符号無整数 (※1)
論理型:
- sc_bit 2-値シングルビット (※2)
- sc_logic 4-値シングルビット
- sc_bv<> sc_bitのベクター(可変配列)
- sc_lv<> sc_logicのベクター
固定小数点型:
- sc_fixed<> 符号付固定小数点テンプレート
- sc_ufixed<> 符号無固定小数点テンプレート
- sc_fix 符号付固定小数点
- sc_ufix 符号無固定小数点
※1 sc_bigint<>, sc_biguintは、sc_int<>, sc_uint<>に比べ著しくシミュレーションスピードが遅い
※2 sc_bitは、IEEE1666ではdeprecated featuresであり、代わりにboolの使用が薦められている
例
加算器の記述例:
# include "systemc.h" SC_MODULE(adder) // モジュール (クラス) 宣言 { sc_in<int> a, b; // ポート sc_out<int> sum; void do_add() // プロセス { sum = a + b; } SC_CTOR(adder) // コンストラクタ { SC_METHOD(do_add); // カーネルへのdo_addの登録 sensitive << a << b; // do_addのセンシティビティリスト } };
参考文献
- Grötker, Thorsten 『SystemCによるシステム設計』柿本勝、河原林政道、長谷川隆(監訳)、丸善、2003年 ISBN 4-621-07144-0 C3055