bool型と「!」と「~」演算子
SystemC(C/C++)を使う上での常識的なネタを。
まずは 以下のサンプルコードを見てください。
- サンプルコード
#include <systemc.h> SC_MODULE( hoge ){ sc_in <bool > clk; sc_in <bool > xrst; sc_in <sc_uint<32> > indata1; sc_in <sc_uint<32> > indata2; sc_out <sc_uint<64> > outdata; void process(); SC_CTOR( hoge ): indata1("indata1") , indata2("indata2") , outdata("outdata") { SC_METHOD( process ); sensitive << clk.pos(); sensitive << xrst.neg(); } }; void hoge::process(){ if( ~xrst.read() ) { outdata.write(0); } else { outdata.write(indata1.read() * indata2.read()); } }
このコードを実行した波形がこちらになります。
outdata(出力データ)が「0」のままになっていると思います。
つまり、どういうことかと言うと「リセット状態」になっているとことです。
では、期待している動作は?というと以下の記述になると思います。
if( ~xrst.read() ) {
→
if( !xrst.read() ) {
修正した場合のシミュレーション結果
ということになります。
解説
※bool型は、unsigned char あるいは charと同じデータ構造(8bit)を持つためです
ビットごとに表示してみると、わかりやすいかもしれません。
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 結果 | |
---|---|---|---|---|---|---|---|---|---|
xrst | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | true |
~xrst | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | true |
!xrst | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | false |
ということになります。
bool型には気をつけてください。