5. 12. 9 SystemCの記述をパラメータ化したモジュールにするには
パラメータ化したモジュールを作りたいときには2つの方法があります。
- コンストラクタ・パラメータ(constructor parameter)を使う方法
- template class を使う方法
最初の方法のわかりやすい例としては、 モジュールを宣言したときに必要なだけのメモリ容量を動的に確保するような、 パラメータ化されたモジュールを宣言したい場合などがあげられます。 また、別の例としてはデバッグ用の情報を出力するかどうか、 パラメータで渡すというような場合です。 これらの場合、デフォールトの値をあらかじめ宣言して置くことで、 指定を省略することができます。
以下にパラメータ化したRAMのモデルの例を示します。 ここでキーとなる使い方としては、SC_CTOR をコンストラクタとして使う代わりに、 C++の通常のコンストラクタをSC_HAS_PROCESS マクロと一緒使うということです。
#ifndef RAM_H
#define RAM_H
#include "systemc.h"
SC_MODULE(ram) {
sc_in<bool> clock;
sc_in<bool> RnW; // ReadNotWrite
sc_in<int> address;
sc_inout<int> data;
void ram_proc();
SC_HAS_PROCESS(ram); //
// 以下が通常のコンストラクタによるramの定義
ram(sc_module_name name_, int size_=64, bool debug_ = false) :
sc_module(name_), size(size_), debug(debug_)
{
SC_THREAD(ram_proc);
sensitive << clock.pos();
buffer = new int[size];
if (debug) {
cout << "Running constructor of " << name() << endl;
}
}
private:
int * buffer;
const int size;
const bool debug;
} ;
void ram::ram_proc()
{
while(true) {
wait(); // synchronous to rising edge
if (RnW) {
data = buffer[address];
}
else {
buffer[address] = data;
}
}
}
#endif
