SCV_SOFT_SONSTRAINTを書いてみた。

SystemVerilog 2012より追加された soft constraintが
どんなものか分からなかったので SCVで書いてみました。

SystemVerilog 2012 : soft constraint

  • サンプルコード
#include <scv.h>

//Valid values for a are 10 or 30
class slower : public scv_constraint_base {
public:
  scv_smart_ptr <int> a;
  SCV_CONSTRAINT_CTOR(slower) {
    SCV_SOFT_CONSTRAINT(
      (a() == 10 || a() == 30)
    );
  }
};

//Valid values for a are 20 or 50
class new_slower : public slower {
  SCV_CONSTRAINT_CTOR(new_slower) {
    SCV_BASE_CONSTRAINT(slower);
    SCV_CONSTRAINT(
      (a() == 20 || a() == 50)
    );
  }
};

int sc_main( int argc, char* argv[] ) {

  slower     s_hoge("slower");
  new_slower n_hoge("new_slower");

  for (int i=0; i<5; i++) {
    s_hoge.next();
    printf( "[SCV] slower data = %d\n", s_hoge.a->read() );
  }
  printf("\n");
  for (int i=0; i<5; i++) {
    n_hoge.next();
    printf( "[SCV] new slower data = %d\n", n_hoge.a->read() );
  }

  return 0;
}
  • 実行結果
$> ./main 

             SystemC 2.2.0 --- Jan 15 2012 14:19:56
        Copyright (c) 1996-2006 by all Contributors
                    ALL RIGHTS RESERVED

*** SCV_WARNING: CONSTRAINT_WARNING_IGNORE_SOFT_CONSTRAINT at time 0 s in process 
    Soft constraints for over-constrained  object 'new_slower' will be ignored. 

[SCV] slower data = 30
[SCV] slower data = 10
[SCV] slower data = 30
[SCV] slower data = 30
[SCV] slower data = 10

[SCV] new slower data = 20
[SCV] new slower data = 20
[SCV] new slower data = 20
[SCV] new slower data = 50
[SCV] new slower data = 20

確かに、制約が上書きされていることが分かります。
でも、SCVの場合 SCV_BASE_CONSTRAINT書かなければ。。。(ry

ちなみに、相反する制約かけると暴走?します。
ぜひお試しください。