SystemC TLM-2.0について
はじめに
背景
TLM-1標準では、トランザクション通信のためのコア・インタフェース群を定義した。
このインタフェース群はいくつかのアプリケーションにおいて成功したものの、メモリ・マップ バスのモデリングと他のon-chip通信ネットワークの観点3つの欠点を持つ。
このインタフェース群はいくつかのアプリケーションにおいて成功したものの、メモリ・マップ バスのモデリングと他のon-chip通信ネットワークの観点3つの欠点を持つ。
- TLM-1は標準トランザクションを持たない
- TLM-1はタイミング・アノテーションをサポートしない
- TLM-1インタフェースは全てのトランザクション・オブジェクトとデータを要求し、シミュレーションが低速となる。若干のアプリケーションはトランザクションオブジェクトで組込形ポインタでこの制約上で動くが、これは標準ではなくそして共通性がない。TLM-2はライフタイムがいくつかのトランスポート・コールで受け渡すトランザクションオブジェクトでこの欠点についてたいしょした。新しい通信インタフェースによりサポートした。
TLM-2では、
- 共通のトランザクション、ジェネリック・ペイロードが用意された
- テンポラル・デカップリング、ウォンタム・キーパーが用意された
- バックドア(DMI)が用意された
TLM-2.0で重視されていること
- シミュレーション速度
- インターオペラビリティ(モデルの共通したインタフェース、モデルの接続性の向上)
TLMへの要求
- ソフトウェア解析
- ソフトウェア・パフォーマンス
- アーキテクチャ解析
- ハードウェア検証
TLM-2コーディングスタイル
TLM2.0Draft2まで次の3つがあった
- Un-Timed(UT) -->TLM-2.0正式版でLTに合わせられた
- Loosely-timed(LT)
- Approximately-timed(AT)
TLM-2.0正式版は2つのコーディングスタイルとなっている
- Loosely-timed(LT)
- Approximately-timed(AT)
Loosely-timed(LT)
- O/S起動とマルチコアシステム実行のための十分なタイミング精度
- プロセスはシミュレーション時間の前に実行可能(テンポラル・デカップリング)
- 各トランザクションは開始と終了の2つのタイミング・ポイントを持つ
- ダイレクト・メモリ・インターフェース(DMI)の使用
- b_transport(推奨)
- nb_transport
Loosely:おおまか
Approximately-timed(AT)
- 別名、cycle-approximate(サイクル-アプロクシメイト)、または、cycle-count-accurate(サイクル-カウント-アキュレート)
- アーキテクチャの調査に十分な精度
- プロセスはシミュレーション時間と横並びに実行
- 各トランザクションは4つのタイミング・ポイントを持つ(拡張可能)
- nb_transport_fw、nb_transport_bw
Approximately:おおよそ
TLM-2.0正式版の機能
テンポラルデカップリング(Temporal Decoupling)
- wait()関数コールを少なくして、シミュレーション高速化を図る仕組み
- LTモデリングで採用
- イニシエータもしくはターゲットでおおよその処理遅延を計算する
- b_transportもしくは、nb_transportによりトランザクションと一緒に処理遅延を渡し、あるタイミングでシミュレーション時間を更新する方法
Direct Memory Interface(DMI)
- トランザクションを発生させないで実メモリアドレスを直接取得する方法
- SW検証環境向けに高速化を図るために有効
TLMインタフェース
次の2つのI/Fが使えれば、TLM-2.0はとりあえずOKかも。
- ターゲットモデルはフォワード(FW)インタフェースを継承する(tlm_fw_transport_if<>)
- イニシエータはバックワード(BW)インタフェースを継承する(tlm_bw_transport_if<>)
- バスモデルは両方のインターフェースを継承する
tlm_fw_transport_if<>(ターゲット側I/F)
次のクラスを継承している。
- tlm_blocking_transport_if<>
- tlm_fw_nonblocking_transport_if<>
- tlm_fw_direct_mem_if<>
- tlm_transport_dbg_if<>
次は純粋仮想関数。
void b_transport (TRANS &trans, sc_core::sc_time &t) tlm_sync_enum nb_transport_fw (TRANS &trans, PHASE &phase, sc_core::sc_time &t) bool get_direct_mem_ptr (TRANS &trans, tlm_dmi &dmi_data) unsigned int transport_dbg (TRANS &trans)
よって、tlm_fw_transport_ifを使用する場合は、最低でも上記4つの関数を定義する必要がある。
tlm_bw_transport_if<>(イニシエータ側I/F)
次のクラスを継承している。
次は純粋仮想関数。
tlm_sync_enum nb_transport_bw (TRANS &trans, PHASE &phase, sc_core::sc_time &t) void invalidate_direct_mem_ptr (sc_dt::uint64 start_range, sc_dt::uint64 end_range)
よって、tlm_bw_transport_ifを使用する場合は、最低でも上記2つの関数を定義する必要がある。
インタフェースコール
b_transport(FW)
void b_transport (TRANS &trans, sc_core::sc_time &t)
- イニシエータからターゲットにデータ転送(ブロッキング)
- TRANSは通常tlm_generic_payload
- tはタイミングアノテーション
nb_transport_fw(FW)
tlm_sync_enum nb_transport_fw (TRANS &trans, PHASE &phase, sc_core::sc_time &t)
- イニシエータからターゲットにデータ転送(ノン・ブロッキング)
- TRANSは通常tlm_generic_payload
- PHASEはtlm_phase、処理状況のフェーズ
- tはタイミングアノテーション
nb_transport_bw(BW)
tlm_sync_enum nb_transport_bw (TRANS &trans, PHASE &phase, sc_core::sc_time &t)
- ターゲットからイニシエータに対して処理状況を通知(ノン・ブロッキング)
get_direct_mem_ptr(FW)
bool get_direct_mem_ptr (TRANS &trans, tlm_dmi &dmi_data)
- 直接メモリの中身をイニシエータから読み書きするためのI/F(DMI)
- イニシエータからターゲットのじメモリのポインタを取得
- トランザクションを介さない、通常の手続きとは異なるデータのやりとり
- サポートしない場合はfalseを返す
invalidate_direct_mem_ptr(FW,BW)
void invalidate_direct_mem_ptr (sc_dt::uint64 start_range, sc_dt::uint64 end_range)
- イニシエータ側にターゲットのメモリマップのポインタが使用不可能な状況になっていることを通知する
- DMI用関数
transport_dbg(FW)
- デバッグ用I/F
- Read/Write等の処理を行わないでデータを取得する
- イニシエータからターゲットの関数を呼ぶ
- サポートしない場合には、0を返す
ソケット
ソケットはイニシエータ<->ターゲット間を通信するためのポート。sc_portとsc_exportをまとめたもにに近い。
インタフェースコールはソケットを介して使用する。
ソケットはすでにいくつか用意されているが、自分専用のソケットを作成してもOK。
tlm_utilsにConvenience socketsとしていくつか用意されている。
インタフェースコールはソケットを介して使用する。
ソケットはすでにいくつか用意されているが、自分専用のソケットを作成してもOK。
tlm_utilsにConvenience socketsとしていくつか用意されている。