SystemCの基本データタイプ
SystemCでは、標準C++のデータ型に加えて以下のようなデータ型が扱える。
基本データタイプ一覧
データタイプ | 符号 | 説明 | 使用例 |
sc_int<W> | 付 | Wビット整数 | sc_int<16> a = -123; |
sc_uint<W> | 無 | sc_uint<32> addr = 0xdeadbeaf; | |
sc_bigint<W> | 付 | Wが64ビット以上の整数 | |
sc_biguint<W> | 無 | ||
sc_bit | - | '0', '1' の2値 | sc_bit b = '1'; |
sc_logic | - | '0', '1', 'x', 'z' の4値 | sc_bit l = 'x'; |
sc_bv<W> | - | sc_bitのWビットベクタ | sc_bv<8> bv = "10110110"; |
sc_lv<W> | - | sc_logicのWビットベクタ | sc_lv<8> lv = "xxxx1010"; |
sc_fixed<NW, NI> | 付 | 固定小数点 NW=全サイズ、NI=整数サイズ |
sc_fixed<8,4> f = -1.25; |
sc_ufixed<NW, NI> | 無 | sc_ufixed<8,4> f = 1.5; |
他にもあるが、基本はこんなもの。
C++では、8、16、32、64といったサイズしか扱うことはできない。
SystemCではハードウェアを意識した記述も書けるようにビットサイズが可変であるデータ型が準備されている。
また、sc_logic、sc_lv<>といった4値を扱うことができるデータ型もある。ただし4値を扱うとシミュレーション速度は低速になる。
SystemCではハードウェアを意識した記述も書けるようにビットサイズが可変であるデータ型が準備されている。
また、sc_logic、sc_lv<>といった4値を扱うことができるデータ型もある。ただし4値を扱うとシミュレーション速度は低速になる。
SystemCの主な利用価値は、ソフトウェアとの強調検証となっている。そのため、速度が低下する4値は扱うことはほとんどない。
高位合成でも、4値は使用せずにsc_int<>、sc_uint<>がほとんどになる。
sc_fixed<>,sc_fixed<>の高速版であるsc_fixed_fast<>,sc_ufixed_fast<>もある。
キャスト(データタイプの変換)
sc_uint<16> x;
sc_int<32> y;
y = (sc_uint<32>)x; // C++のキャストと同じ
変換一覧(to_xxx)
基本データタイプに共通。
戻り値 | 関数 |
int | to_int() |
unsigned int | to_uint() |
long | to_long() |
unsigned long | to_ulong() |
int64 | to_int64() |
uint64 | to_uint64() |
double | to_double() |
const std::string | to_string() |
to_stringの使い方
- 書式
const std::string to_string (sc_numrep numrep) const
sc_numrep列挙 | 説明 | 例(sc_int<8> 100) | 例(sc_int<8> -100) |
SC_NOBASE = 0 | そのまま | "100" | "-100" |
SC_BIN = 2 | 2進数 | "0b01100100" | "0b10011100" |
SC_OCT = 8 | 8進数 | "0o144" | "0o634" |
SC_DEC = 10 | 10進数 | "100" | "-100" |
SC_HEX = 16 | 16進数 | "0x64" | "0x9c" |
SC_BIN_US | 2進数(2の補数) | "0bus1100100" | "negative" |
SC_BIN_SM | 符号付2進数 | "0bsm01100100" | "-0bsm01100100" |
SC_OCT_US | 8進数(2の補数) | "0ous144" | "negative" |
SC_OCT_SM | 符号付8進数 | "0osm144" | "-0osm144" |
SC_HEX_US | 16進数(2の補数) | "0xus64" | "negative" |
SC_HEX_SM | 符号付16進数 | "0xsm64" | "-0xsm64" |
SC_CSD | 正規化符号付数字 | "0csd10-00100" | "0csd-0100-00" |
coutで表示させたい場合
- 2進数で代入したい場合。
普通Cでは、2進数は表示できないがSystemCならば表示できたりする。
sc_int<8> data = "0b01010011";
cout << "data = " << data.to_string(SC_HEX) << endl;
"0b"の後に"0"を付けると正数、"1"を付けると負数となる。
sc_int<8> data = 100;
cout << data << endl; // 通常表示
cout << data.to_string( SC_HEX ) << endl; // 16進数
printfで表示させたい場合
SystemCのデータ型を表示するときの方法。
sc_int<32> data;
printf( "data = %d\n", (int)data ); // キャスト
printf( "data = %d\n", data.to_int() ); // int型に変換
次の方法はダメ。
printf( "data = %d\n", data ); // セグメンテーションエラー
以下のような警告が出る。
test.cpp: function 内の `int sc_main(int, char**)': test.cpp:9: 警告: cannot pass objects of non-POD type `class sc_dt::sc_int<32>' through `...'; call will abort at runtime
ただし、コンパイルは通る。
通るが、実行すると"セグメンテーションエラー"となる。
通るが、実行すると"セグメンテーションエラー"となる。
sc_stringがない?
SystemCのバージョン2.2ではsc_stringがなくなっている。
とりあえず、以下のようにすればよいかも。
とりあえず、以下のようにすればよいかも。
typedef sc_string std:string;