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());
  }
}

このコードを実行した波形がこちらになります。

f:id:kocha2012:20121213000318p:plain

outdata(出力データ)が「0」のままになっていると思います。
つまり、どういうことかと言うと「リセット状態」になっているとことです。
では、期待している動作は?というと以下の記述になると思います。

  if( ~xrst.read() ) {

  if( !xrst.read() ) {

修正した場合のシミュレーション結果

f:id:kocha2012:20121213000345p:plain

ということになります。

解説

※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型には気をつけてください。