SystemC:name()関数使ってますか?

SystemC Advent Calendar2012 の 9日目の記事です。

SystemCを構成しているライブラリには、name()関数が存在します。
name()関数は色々な場面で使えると思います。


モジュールや信号のインスタンスを取得する。


  • サンプルコード

     1|#include <systemc.h>
     2|
     3|SC_MODULE (hoge) {
     4|  sc_in<bool>         clock;
     5|  sc_in<bool>         reset;
     6|  sc_in<sc_uint<8> >  indata;
     7|  sc_out<sc_uint<8> > outdata;
     8|
     9|  void process() {
    10|    outdata.write(0);
    11|    wait();
    12|
    13|    while (true) {
    14|      wait();
    15|      printf("Instance Name:%s\n", name());
    16|      printf("Port(clock  ) Name:%s\n", clock.name());
    17|      printf("Port(reset  ) Name:%s\n", reset.name());
    18|      printf("Port(indata ) Name:%s\n", indata.name());
    19|      printf("Port(outdata) Name:%s\n", outdata.name());
    20|    }
    21|  }
    22|
    23|  SC_CTOR(hoge)
    24|  {
    25|    SC_CTHREAD(process,clock.pos());
    26|      reset_signal_is(reset, false);
    27|  }
    28|}; 
    29|
    30|int sc_main (int argc, char* argv[]) {
    31|  sc_clock clock ("clock",1,SC_NS);
    32|  sc_signal<bool>        reset;
    33|  sc_signal<sc_uint<8> > indata;
    34|  sc_signal<sc_uint<8> > outdata;
    35|
    36|  hoge uhoge("uhoge");
    37|  uhoge.clock(clock);
    38|  uhoge.reset  (reset  );
    39|  uhoge.indata (indata );
    40|  uhoge.outdata(outdata);
    41|
    42|  reset = 1;
    43|  indata = 10;
    44|  sc_start(3SC_NS);
    45|
    46|  return 0;
    47|}
  • 実行結果

  • Instance Name:uhoge
    Port(clock  ) Name:uhoge.port_0
    Port(reset  ) Name:uhoge.port_1
    Port(indata ) Name:uhoge.port_2
    Port(outdata) Name:uhoge.port_3
    

パラメータを取得する。


モジュール自身でTOP階層からどのようにインスタンスされているか確認することができます。
この name()関数と 以前紹介した sc_argv を利用することで、 一つのパラメータファイルから自分自身のパラメータのみ抽出し反映させることができます。
今回は手順のみ紹介します。

  1. パラメータファイルを用意
    中身はこんな感じで、TOP階層から記述します。
    top.uhoge.size = 10
  2. モジュール内部で、sc_argv()利用しパラメータファイルを読み込む
  3. ファイル読み込み時に name()+パラメータのパターンマッチを行う
  4. パターンマッチした場合は 値を代入する

といった感じで、外部ファイルから自分自身のパラメータを取得するような方法もできます。


次回予告


今回、name()関数を紹介し、インスタンス名や信号名を取得することができます。
しかし、信号名に関しては Port_x(x:番号)になっていたと思います。
これを解決する手段を紹介します。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
09 | 2017/10 | 11
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
アクセス人数