SystemC:未使用 or 固定値端子の処理
How to terminate unused ports of modules in the port binding?
SystemCモデルの接続において、Verilog HDLのように
未使用端子を簡単に処理出来ません。
VHDLのように何かしらを接続する必要があります。
つまり、以下のようなコードになります。
#include <systemc.h> SC_MODULE( hoge ){ sc_in <int> a; sc_in <int> b; sc_in <int> c; sc_out<int> out; sc_out<bool> irq; void process(){ out = a + b + c; irq = ((a+b+c) > 10)? 1 : 0; } SC_CTOR( hoge ) { SC_METHOD( process ); sensitive << a << b << c ; } }; int sc_main( int argc, char* argv[] ) { sc_signal<int> sig_a; sc_signal<int> sig_b; sc_signal<int> sig_c; sc_signal<int> sig_out; sc_signal<bool> sig_irq; hoge uhoge("hoge"); uhoge.a(sig_a); uhoge.b(sig_b); uhoge.c(sig_c); uhoge.out(sig_out); uhoge.irq(sig_irq); sig_a = 1; sig_b = 2; sig_c = 3; sc_start(1.0, SC_PS); cout << "a = " ; sig_a.print(); cout << ", "; cout << "b = " ; sig_b.print(); cout << ", "; cout << "c = " ; sig_c.print(); cout << ", "; cout << "out = "; sig_out.print(); cout << ", "; cout << "irq = "; sig_irq.print(); cout << endl; sig_a = 3; sig_b = 4; sig_c = 5; sc_start(1.0, SC_PS); cout << "a = " ; sig_a.print(); cout << ", "; cout << "b = " ; sig_b.print(); cout << ", "; cout << "c = " ; sig_c.print(); cout << ", "; cout << "out = "; sig_out.print(); cout << ", "; cout << "irq = "; sig_irq.print(); cout << endl; return 0; }
実行結果
a = 1, b = 2, c = 3, out = 6, irq = 0 a = 3, b = 4, c = 5, out = 12, irq = 1
さて、これは非常に手間だと思います。
わざわざ sc_signalを宣言し、値を代入する。
なので、そのような手間を省くために共通化したクラス(部品)を作ればいいのです。
- オープン端子(output側)
static struct { template < typename T > operator sc_core::sc_signal_inout_if<T> & () const { return *(new sc_core::sc_signal<T>(sc_core::sc_gen_unique_name("vh_open"))); } } const vh_open = {};
- 固定値(input側)
template<typename T> sc_core::sc_signal_in_if<T> const & vh_const( T const & v ) // keep the name consistent with vh_open { // Yes, this is an (elaboration-time) memory leak. You can avoid it with some extra effort sc_core::sc_signal<T>* sig_p = new sc_core::sc_signal<T>( sc_core::sc_gen_unique_name("vh_const") ); sig_p->write( v ); return *sig_p; }
記述全体はこちらになります。
#include <systemc.h> //---------------------------------------------// static struct { template < typename T > operator sc_core::sc_signal_inout_if<T> & () const { return *(new sc_core::sc_signal<T>(sc_core::sc_gen_unique_name("vh_open"))); } } const vh_open = {}; //---------------------------------------------// template<typename T> sc_core::sc_signal_in_if<T> const & vh_const( T const & v ) // keep the name consistent with vh_open { // Yes, this is an (elaboration-time) memory leak. You can avoid it with some extra effort sc_core::sc_signal<T>* sig_p = new sc_core::sc_signal<T>( sc_core::sc_gen_unique_name("vh_const") ); sig_p->write( v ); return *sig_p; } //---------------------------------------------// SC_MODULE( hoge ){ sc_in <int> a; sc_in <int> b; sc_in <int> c; sc_out<int> out; sc_out<bool> irq; void process(){ out = a + b + c; irq = ((a+b+c) > 10)? 1 : 0; } SC_CTOR( hoge ) { SC_METHOD( process ); sensitive << a << b << c ; } }; int sc_main( int argc, char* argv[] ) { sc_signal<int> sig_a; sc_signal<int> sig_b; sc_signal<int> sig_c; sc_signal<int> sig_out; sc_signal<bool> sig_irq; hoge uhoge("hoge"); uhoge.a(sig_a); uhoge.b(sig_b); uhoge.c(vh_const(42)); // const value uhoge.out(sig_out); uhoge.irq(vh_open); // open sig_a = 1; sig_b = 2; sig_c = 3; sc_start(1.0, SC_PS); cout << "a = " ; sig_a.print(); cout << ", "; cout << "b = " ; sig_b.print(); cout << ", "; cout << "c = " ; sig_c.print(); cout << ", "; cout << "out = "; sig_out.print(); cout << ", "; cout << "irq = "; sig_irq.print(); cout << endl; sig_a = 3; sig_b = 4; sig_c = 5; sc_start(1.0, SC_PS); cout << "a = " ; sig_a.print(); cout << ", "; cout << "b = " ; sig_b.print(); cout << ", "; cout << "c = " ; sig_c.print(); cout << ", "; cout << "out = "; sig_out.print(); cout << ", "; cout << "irq = "; sig_irq.print(); cout << endl; return 0; }
実行結果はこちら
a = 1, b = 2, c = 3, out = 45, irq = 0 a = 3, b = 4, c = 5, out = 49, irq = 0
ちゃんと出来ていますね!