SystemC:bool型を連結するのはやめましょう
bool型でハマりそうな(私が勝手にハマっただけかも)記述について紹介。
ビット連結記述の際には注意が必要です。
※bool型の詳細について、今後紹介。
- サンプルコード
#include <stdio.h> #include <systemc.h> int main (int argc, char* argv[]) { sc_uint<8> in; in = 0xfa; bool b7 = in[6] ^ in[5] ^ in[4]; bool b6 = in[7] ^ in[6] ^ in[4] ^ in[3]; bool b5 = in[6] ^ in[5] ^ in[3] ^ in[2]; bool b4 = in[5] ^ in[3] ^ in[2] ^ in[1]; bool b3 = in[6] ^ in[5] ^ in[2] ^ in[1] ^ in[0]; bool b2 = in[6] ^ in[1] ^ in[0]; bool b1 = in[5] ^ in[0]; bool b0 = in[7] ^ in[6] ^ in[5]; sc_uint<8> out = ( b7, b6, b5, b4, b3, b2, b1, b0 ); cout << " in = " << in.to_string(SC_BIN) << endl; cout << " out = " << out.to_string(SC_BIN) << endl; return 0; }
- 実行結果(NG)
$> ./main in = 0b011111010 out = 0b000000001
というような結果になってしまいます。
もちろん、Warningはしっかりでますのでチェックしていれば問題ないと思います。
一つの解決手段としては、
sc_uint<1> b7 = in[6] ^ in[5] ^ in[4]; sc_uint<1> b6 = in[7] ^ in[6] ^ in[4] ^ in[3]; sc_uint<1> b5 = in[6] ^ in[5] ^ in[3] ^ in[2]; sc_uint<1> b4 = in[5] ^ in[3] ^ in[2] ^ in[1]; sc_uint<1> b3 = in[6] ^ in[5] ^ in[2] ^ in[1] ^ in[0]; sc_uint<1> b2 = in[6] ^ in[1] ^ in[0]; sc_uint<1> b1 = in[5] ^ in[0]; sc_uint<1> b0 = in[7] ^ in[6] ^ in[5];
ですね。上記のようなサンプルコードなら、
out[0] = in[6] ^ in[5] ^ in[4]; out[1] = in[7] ^ in[6] ^ in[4] ^ in[3]; out[2] = in[6] ^ in[5] ^ in[3] ^ in[2]; out[3] = in[5] ^ in[3] ^ in[2] ^ in[1]; out[4] = in[6] ^ in[5] ^ in[2] ^ in[1] ^ in[0]; out[5] = in[6] ^ in[1] ^ in[0]; out[6] = in[5] ^ in[0]; out[7] = in[7] ^ in[6] ^ in[5];
って書けばいいじゃん!っていうツッコミもありますが。。。
- 実行結果(OK)
$> ./main in = 0b011111010 out = 0b010111011