モデル作成の実際 - CQ出版社

短期集中
連載
第3回
デバイスの記事
ビギナーズ
モデル作成の実際
(最終回)
平尾智也,赤星博輝
連載第 1 回(本誌 2008 年 7 月号,pp.103-112)と第 2 回
ことができる点も重要です.どのような点を考えて作られ
(本誌 2008 年 9 月号,pp.139-148)では,OSCI(Open
たかという視点でみれば,
「トランザクション・レベルを
SystemC Initiative)の TLM 1.0 について説明した.今回は
どのように効果的に利用すべきか」や,「どういった点に注
TLM 1.0 が実際にどのように使われているかを説明する.ま
意すべきか」などの点が見えてくるかもしれません.
ず,実際に TLM が使われている SCML(SystemC Modeling
Library)を見ていく.そして,TLM 2.0 ではどうなってきて
いるかについて,簡単に紹介する.
(筆者)
SystemC が利用される状況を考えてみると,
¡実際の機能が正しく動くかについて確認する Functional
View
¡良いアーキテクチャを探索するような Architect's View
ハードウェア,ソフトウェアに限らず,大規模な物を作
成していくには,さまざまな決まり(独自ルールや標準ルー
ルなど)を作って,再利用可能な部品を利用することがほ
¡ソフトウェアを開発する Programmer's View
¡実際のハードウェアとソフトウェアを組み合わせて検証
を行う Verification View
とんどになると思います.再利用可能な部品ができると,
が想定されています.そのために,SCML の目的は,
それを使用するための道具も再利用できることになり,ど
¡高速なシミュレーション速度
んどん便利な環境が出来上がっていきます.
¡効率的なモデル作成
SystemC も同じことがいえます.今回紹介する SCML
(SystemC Modeling Library)は,OSCI(Open SystemC
¡モデルの再利用性
が挙げられています.
Initiative)で標準化を行っていた TLM 1.0 を利用して作成
個人的には,シミュレーション速度に関しては,この
されています.さらに,OSCI から配布されている SCV
SCML ではトランザクション・レベルによるモデリングと
(SystemC Verification)も利用しています.また,OCP-
いうことが大きな影響を与えているといえます.今回は紹
IP( OCP International Partnership Association, Inc.)の
介しませんが,クロック・ベースのモデル用のライブラリ
インターフェースなども利用しています.
なども用意されています.SystemC では RTL(Register
SCML は,2006 年に米国CoWare 社がオープン・ソース
Transfer Level)でモデリングを行うと,あまり効率良くシ
としてリリースしたものです.ソース・コードやマニュア
ミュレーションができないため,シミュレーション速度を
ルなどは公開されています.CoWare 社のツール上だけで
大きく落とすことになるのですが,そうしたものを改善す
なく,OSCI の配布しているリファレンス・シミュレータ
るためにscml_clock_counter,scml_divded_clock,
でも動作します.
scml_clock_gate などのライブラリが用意されてい
SCML がどのような点の機能を拡張したかについて知る
Keyword
ます.
OSCI,TLM,SCML,SystemC,トランザクション・レベル,スレーブ・モデル,イニシエータ,メモリ管理
Design Wave Magazine 2009 March/April 113
本稿では,効率的なモデル作成という点では,スレー
scml_memory というライブラリを利用すると簡単に作成
ブ・モデルの作成およびマスタ・モデルの作成を解説し,
できます.詳細はマニュアル(2)を見てください.ここでは
SCML を使うことでどのようにモデルが作成できるかにつ
基本的な scml_memory の使用方法を簡単に説明します.
リスト 1 のように,モジュール内では scml_memory の
いて見ていただきたいと思います.
変数を宣言し,コンストラクタ(SC_CTOR)でサイズや使
1.スレーブ・モデルを作ってみよう!
用するモード,初期値などを設定できます.内容にアクセ
スするときにも,通常の配列と同様に m_regs[i]でアク
スレーブ・モデルの基本構造を図1 に示します.ターゲッ
セスできます.これだけだと普通の配列を用いてもよいわ
ト・ポートPVtarget_port とレジスタやメモリを作成し
けですが,後で述べるように scml_memory は SCML を
ます.
使ったモデルを簡単に作成できます.
● レジスタとメモリの作成
● ターゲット・ポートの作成
SCML でモデル内にレジスタやメモリを作成するには,
ターゲット・ポートはリスト 2 のように作られています.
TLM 1.0 であった transport というインターフェースを
持つインターフェース PV_if を定義し,そのインター
PVtarget_port
レジスタや
メモリ
処理
フェースを sc_export で継承してターゲット・ポート
PVTarget_port を作成しています.
ここで TLM 1.0 から注意してほしいところがあります.
図1
SCML のスレーブ・モデルの基本構造
PVtarget_port が tlm_transport_if から継承して作成されている.その
transport が呼ばれた際の処理を記述することで,レジスタやメモリの値を
操作する.
リスト1
SCML ではリクエストを扱うデータ型が PVReq<DT,AT>
で,レスポンスを返すデータ型が PVResp<DT> になりま
す.DT はデータ型で,AT はアドレス型です.例えば,デー
タが int で, アドレスが unsigned int なら PVReq<
scml_memory の使い方
高機能な配列として使用できる.
unsigned int型の
scml_memoryを宣言
#include "systemc.h"
#include "scml.h"
SC_MODULE(target1){
scml_memory <unsigned int> m_regs;
void foo(void) {
for (int i=0; i<10;i++) {
m_regs[i]=i+100;
}
for (int i=0; i<10;i++) {
cout << "m_regs[" << i << "]=" << m_regs[i] <<"¥n";
}
for (int i=0; i<10;i++) {
m_regs.write( i+200,i);
}
for (int i=0; i<10;i++) {
cout << "m_regs[" << i << "]=" << m_regs[i] <<"¥n";
}
サイズを10で確保
}
SC_CTOR(target1):m_regs("m_regs",
m_regs.set_addressing_mode(32);
m_regs.initialize(0);
SC_THREAD(foo);
}
scml_memsize(10)){
};
リスト2
ターゲット・ポートPVTarget_port の定義
template <typename DT, typename AT = void>
class PV_if : virtual public tlm::tlm_transport_if<
PVReq<DT,AT>, PVResp<DT> >
{
public :
virtual PVResp<DT> transport(const PVReq< DT, AT
>& arg_Req) = 0;
};
(a)PV_if の定義
template <typename DT, typename AT>
class PVTarget_port: public sc_export< PV_if< DT, AT>
>
{
private :
PVTarget_process< DT, AT>* m_proc;
public :
PVTarget_port();
explicit PVTarget_port( const char* name );
アドレスを(バイト
ではなく)32ビット
で定義する
~PVTarget_port();
template <class Module>
void CB(Module* arg_module,
PVResp<DT>( Module::*arg_cb)
(const PVReq< DT, AT >& arg_Req));
int sc_main(int argc, char**argv) {
target1 u1("U1");
内容を0で初期化
cout <<“sample program¥n";
};
sc_start(1, SC_MS);
}
(b)PVTarget_port の定義
114 Design Wave Magazine 2009 March/April