はじめに
SystemC を使う必要が出てきたので、勉強がてら記録を残していこうと思う。
まず、Google で 「SystemC 入門」などと調べても日本語の記事が極端に少なかったので、英語文献になるが asic-world を参考に勉強していこうと思う。
SystemC とは?
SystemC は特別な言語ではなく C++ のライブラリとして提供してある。SystemCライブラリにはハードウェア記述を目的とした、並列実行、データ型、信号同期、シミュレーションカーネルが定義してある。また、ハードウェア設計に欠かせない波形デバッグもできるように、VCD,ISDB,WIF のフォーマットでトレースファイルを出力できるようになっている。
SystemCのインストール手順はここでは省くが、以前 Macにインストールする記事も書いているので参考にしてほしい。
しかし、現在はDocker上に環境を作り、コンパイルするときのみコンテナを作成している。
HelloWorld
ここでは、新しいプログラミング言語(厳密には違う)を習得する際の決まり事である HelloWorldを出力してみる。最初は理解できないことが多いと思うが、おいおい説明する。
ちなみに今回のSystemC のバージョンは SystemC-2.3.3 をつかっている。
#include <systemc.h>
SC_MODULE (hello_world) {
SC_CTOR (hello_world){
}
void say_hello (){
cout << "Hello World \n";
}
};
int sc_main(int argc, char* argv[]){
hello_world hello("HELLO");
hello.say_hello();
return 0;
}
もちろんベースは C++ だから見たことある記述もあるだろう。
簡単な説明だけしておくと、sc_main は通常の main文である。
ここではモジュールをクラスで実装する。SC_MODULE(モジュール名)で宣言できる。また、コンストラクタSC_CTOR(モジュール名)を内包する。動作(メソッド)をvoidで定義しておく。
DataTypes
ベースが C++ だから、C++ で用いられるデータ型は当然使うことができる。
型指定 | 型の内容 |
---|---|
bool | true か false の2値の1ビット型 |
int | 符号付整数(32ビット幅) |
unsigned int | 符号なし整数(32ビット幅) |
long | 符号付整数(32ビット幅) |
unsigned long | 符号なし整数(32ビット幅) |
signed char | 符号付き文字型(8ビット幅) |
unsigned char | 符号なし文字型(16ビット幅) |
short | 符号付ショート型(16ビット幅) |
unsigned short | 符号なしショート型(16ビット幅) |
float | 浮動少数点数(32ビット幅) |
double | 倍精度浮動小数点数(64ビット幅) |
enum | ユーザー定義列挙型 |
struct | 全メンバ |
ただしビット幅は実行環境依存である。 |
SystemC では独自のハードウェア向けデータ型を提供している。
HDL言語のようにビット幅指定ができたり、複数ビット幅を持ったデータ型も使える。
型指定 | 型の内容 |
---|---|
sc_int < n > | 最大64ビット幅のnビット幅符号付き整数型 |
sc_uint < n > | 最大64ビット幅のnビット幅符号なし整数型 |
sc_bigint < n > | 64ビット超えのnビット幅符合付き整数型 |
sc_biguint < n > | 最大64ビット幅のnビット幅符号なし整数型 |
sc_bit | 今後使わない |
sc_bv < n > | 今後使わない |
sc_logic | 0,1,X,Z の4値の1ビット型 |
sc_lv < n > | nビット幅のlogic型 |
終わりに
まだわからないことが多いので、間違いが散見するかもしれないが、知識の更新とともに記事も更新していこうと思う。
参考文献
asic-world
http://www.asic-world.com/systemc/
SystemC によるシステムデザイン入門