bambooflow Note

基本データタイプ

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

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の主な利用価値は、ソフトウェアとの強調検証となっている。そのため、速度が低下する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;
 
記事メニュー
目安箱バナー