[SystemC] 未使用 or 固定値端子の処理について

How to terminate unused ports of modules in the port binding?


SystemCモデルの接続において、Verilog HDLのように
未使用端子を簡単に処理出来ません。
VHDLのように何かしらを接続する必要があります。


つまり、以下のようなコードになります。

 1|#include <systemc.h>
 2|
 3|SC_MODULE( hoge ){
 4|  sc_in <int>  a;
 5|  sc_in <int>  b;
 6|  sc_in <int>  c;
 7|
 8|  sc_out<int>  out;
 9|  sc_out<bool> irq;
10|
11|  void process(){
12|    out = a + b + c;
13|    irq = ((a+b+c) > 10)? 1 : 0;
14|  }
15|
16|  SC_CTOR( hoge )
17|  {
18|    SC_METHOD( process );
19|    sensitive << a << b << c ;
20|  }
21|};
22|
23|int sc_mainint argc, char* argv[] ) {
24|
25|  sc_signal<int>  sig_a;
26|  sc_signal<int>  sig_b;
27|  sc_signal<int>  sig_c;
28|  sc_signal<int>  sig_out;
29|  sc_signal<bool> sig_irq;
30|
31|  hoge uhoge("hoge");
32|  uhoge.a(sig_a);
33|  uhoge.b(sig_b);
34|  uhoge.c(sig_c);
35|  uhoge.out(sig_out);
36|  uhoge.irq(sig_irq);
37|
38|  sig_a = 1;
39|  sig_b = 2;
40|  sig_c = 3;
41|
42|  sc_start(1.0SC_PS);
43|
44|  cout << "a = " ; sig_a.print(); cout << ", ";
45|  cout << "b = " ; sig_b.print(); cout << ", ";
46|  cout << "c = " ; sig_c.print(); cout << ", ";
47|  cout << "out = "; sig_out.print(); cout << ", ";
48|  cout << "irq = "; sig_irq.print(); cout << endl;
49|
50|  sig_a = 3;
51|  sig_b = 4;
52|  sig_c = 5;
53|
54|  sc_start(1.0SC_PS);
55|
56|  cout << "a = " ; sig_a.print(); cout << ", ";
57|  cout << "b = " ; sig_b.print(); cout << ", ";
58|  cout << "c = " ; sig_c.print(); cout << ", ";
59|  cout << "out = "; sig_out.print(); cout << ", ";
60|  cout << "irq = "; sig_irq.print(); cout << endl;
61|
62|  return 0;
63|}

実行結果

a = 1, b = 2, c = 3, out = 6, irq = 0
a = 3, b = 4, c = 5, out = 12, irq = 1

さて、これは非常に手間だと思います。
わざわざ sc_signal(サンプルではsig_a/b/c...)を宣言し、値を代入する。
なので、そのような手間を省くために共通化したクラス(部品)を作ればいいのです。

  • オープン端子(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;
    }

記述全体はこちらになります。

 1|#include <systemc.h>
 2|
 3|//---------------------------------------------//
 4|static struct {
 5|
 6|  template < typename T >
 7|  operator sc_core::sc_signal_inout_if<T> & () const
 8|  {
 9|    return *(new sc_core::sc_signal<T>(sc_core::sc_gen_unique_name("vh_open")));
10|  }
11|
12|const vh_open = {};
13|//---------------------------------------------//
14|template<typename T>
15|sc_core::sc_signal_in_if<T> const &
16|vh_const( T const & v ) // keep the name consistent with vh_open
17|{
18|  // Yes, this is an (elaboration-time) memory leak.  You can avoid it with some extra effort
19|  sc_core::sc_signal<T>* sig_p = new sc_core::sc_signal<T>( sc_core::sc_gen_unique_name("vh_const") );
20|  sig_p->write( v );
21|  return *sig_p;
22|}
23|//---------------------------------------------//
24|
25|SC_MODULE( hoge ){
26|  sc_in <int>  a;
27|  sc_in <int>  b;
28|  sc_in <int>  c;
29|
30|  sc_out<int>  out;
31|  sc_out<bool> irq;
32|
33|  void process(){
34|    out = a + b + c;
35|    irq = ((a+b+c) > 10)? 1 : 0;
36|  }
37|
38|  SC_CTOR( hoge )
39|  {
40|    SC_METHOD( process );
41|    sensitive << a << b << c ;
42|  }
43|};
44|
45|int sc_mainint argc, char* argv[] ) {
46|
47|  sc_signal<int>  sig_a;
48|  sc_signal<int>  sig_b;
49|  sc_signal<int>  sig_c;
50|  sc_signal<int>  sig_out;
51|  sc_signal<bool> sig_irq;
52|
53|  hoge uhoge("hoge");
54|  uhoge.a(sig_a);
55|  uhoge.b(sig_b);
56|  uhoge.c(vh_const(42)); // const value
57|  uhoge.out(sig_out);
58|  uhoge.irq(vh_open);  // open
59|
60|  sig_a = 1;
61|  sig_b = 2;
62|  sig_c = 3;
63|
64|  sc_start(1.0SC_PS);
65|
66|  cout << "a = " ; sig_a.print(); cout << ", ";
67|  cout << "b = " ; sig_b.print(); cout << ", ";
68|  cout << "c = " ; sig_c.print(); cout << ", ";
69|  cout << "out = "; sig_out.print(); cout << ", ";
70|  cout << "irq = "; sig_irq.print(); cout << endl;
71|
72|  sig_a = 3;
73|  sig_b = 4;
74|  sig_c = 5;
75|
76|  sc_start(1.0SC_PS);
77|
78|  cout << "a = " ; sig_a.print(); cout << ", ";
79|  cout << "b = " ; sig_b.print(); cout << ", ";
80|  cout << "c = " ; sig_c.print(); cout << ", ";
81|  cout << "out = "; sig_out.print(); cout << ", ";
82|  cout << "irq = "; sig_irq.print(); cout << endl;
83|
84|  return 0;
85|}

実行結果はこちら

a = 1, b = 2, c = 3, out = 45, irq = 0
a = 3, b = 4, c = 5, out = 49, irq = 0

ちゃんと出来ていますね!

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数