ためになるホームページ お問い合わせ




TOP > SystemC > チャネルの作成
チャネル
複数のモジュール間を接続するのに、SystemCで用意されているインタフェースを使って接続する亊ができる。ユーザはインタフェース部分を実装し、チャネルを作成すればよい。

インターフェースの記述
各モジュールとの接続インタフェースを作成する。インタフェースを作成するには、SystemCで用意されているsc_interfaceクラスを継承したクラスを作成する必要がある。
ここで用意したクラスは、チャネルが継承するので、内部で宣言したメソッドは仮想関数としてチャネルクラスで実装させる。

インタフェースの記述の例

#include "systemc.h"

//インタフェースクラスは、sc_interfaceを継承する
class write_if : public sc_interfase
{
public:
  //これらのメソッドは、チャネルクラス内で実装させる
  virtual void write(char) = 0;
};

class read_if : public sc_interfase
{
public:
  //これらのメソッドは、チャネルクラス内で実装させる
  virtual void read(char&) = 0;
};


チャネルの実装
モジュール間のインタフェースを宣言したら、それらを実装させる必要がある。実装する箇所は、SystemCのsc_channelを継承したクラスで実装させる。このクラス内で、各モジュールのデータのやりとりの内容を記述する。
以下は、SystemCのサンプルプログラム(simple_perf.cpp)を一部必要な箇所を抜粋したところである。

チャネルクラスの例
class fifo : public sc_channel, public write_if, public read_if
{
public:
  //コンストラクタ
  fifo(sc_module_name name, int size_) : sc_channel(name), size(size_)
  {
    data = new char[size];
    num_elements = first = 0;
  }

  ~fifo()
  {
    delete[] data;
  }
  
  //インタフェースの実装
  void write(char c)
  {
    if (num_elements == size)
      wait(read_event);
    data[(first + num_elements) % size] = c;
    ++num_elements;
    write_event.notify();
  }

  void read(char& c)
  {
    if (num_elements == 0)
     wait(write_event);

    c = data[first];
    --num_elements;
    first = (first + 1) % size;
    read_event.notify();
  }

  void reset () { num_elements = first = 0;}
private:
  char* data;
  int num_elements;
  sc_event write_event, read_event;
  int size;
};

各モジュール間の接続
チャネルを作成したら、各モジュールとチャネルを接続する必要がある。
以下は、SystemCのサンプルプログラム(simple_perf.cpp)を一部必要な箇所を抜粋したところである。

モジュールの接続の例
class producer : public sc_module
{
public:
  sc_port<write_if> out;  //チャネルのIFと接続

  SC_HAS_PROCESS(producer);
  producer(sc_module_name name) : sc_module(name)
  {
    SC_THREAD(main);
  }

  void main()
  {
    const char *str = "Visit www.systemc.org and see what SystemC can do for you today!\n";
    const char *p = str;
    int total = 100000;

    while (true)
    {
      int i = 1 + int(19.0 * rand() / RAND_MAX);  //  1 <= i <= 19

      while (--i >= 0)
      {
        out->write(*p++);
        if (!*p) p = str;
        --total;
      }

      if (total <= 0)
        break;

      wait(1000, SC_NS);
    }
  }
};

class consumer : public sc_module
{
public:
  sc_port<read_if> in;  //チャネルのIFと接続

  SC_HAS_PROCESS(consumer);

  consumer(sc_module_name name) : sc_module(name)
  {
    SC_THREAD(main);
  }

  void main()
  {
    char c;

    while (true) 
    {
      in->read(c);
      wait(100, SC_NS);
    }
  }
};





Copyright 2007 ためになるホームページ All Rights Reserved.