Verification Engineerの戯言
unit_test/tlm/common/include/modelsディレクトリにSimpleBus.hファイルがあります。
このファイルは、マルチポート(マルチイニシエータ/マルチターゲット)対応のバスモデルです。
このファイルは、マルチポート(マルチイニシエータ/マルチターゲット)対応のバスモデルです。
SimBusクラスの定義の一部は、次のようになっています
ポートの数は、SimpleBusをインスタンスにしたときに次のように指定します。
コンストラクタでは、各ソケットに対する設定を行っています。
ターゲットソケット(target_socket)では、3つのマクロを使って、メソッドの設定を行っています。
一方、イニシエータソケット(initiator_socket)では、2つのマクロを使って、メソッドの設定を行っています。
最後に2つのメソッドをSC_THREADで登録しています。
template <int NR_OF_INITIATORS, int NR_OF_TARGETS> class SimpleBus : public sc_core::sc_module { public: typedef tlm::tlm_generic_payload transaction_type; typedef tlm::tlm_dmi_mode dmi_mode_type; typedef tlm::tlm_phase phase_type; typedef tlm::tlm_sync_enum sync_enum_type; typedef SimpleTargetSocket<> target_socket_type; typedef SimpleInitiatorSocket<> initiator_socket_type; public: target_socket_type target_socket[NR_OF_INITIATORS]; initiator_socket_type initiator_socket[NR_OF_TARGETS]; public: SC_HAS_PROCESS(SimpleBus); SimpleBus(sc_core::sc_module_name name) : sc_core::sc_module(name), mAbstraction(TLM_LT), mRequestPEQ("requestPEQ"), mResponsePEQ("responsePEQ") { for (unsigned int i = 0; i < NR_OF_INITIATORS; ++i) { REGISTER_NBTRANSPORT_USER(target_socket[i], initiatorNBTransport, i); REGISTER_DEBUGTRANSPORT_USER(target_socket[i], transportDebug, i); REGISTER_DMI_USER(target_socket[i], getDMIPointer, i); } for (unsigned int i = 0; i < NR_OF_TARGETS; ++i) { REGISTER_NBTRANSPORT(initiator_socket[i], targetNBTransport); REGISTER_INVALIDATEDMI(initiator_socket[i], invalidateDMIPointers); } SC_THREAD(RequestThread); SC_THREAD(ResponseThread); } // 以下、略 };SimBusクラスは、SimpleTargetSocketとSimpleInitiatorSocketの2つのSocketを持っています。
ポートの数は、SimpleBusをインスタンスにしたときに次のように指定します。
SimpleBus bus<2,4>この例では、SimpleInitiatorSocketの数が2で、SimpleTargetSocketの数が4です。
コンストラクタでは、各ソケットに対する設定を行っています。
ターゲットソケット(target_socket)では、3つのマクロを使って、メソッドの設定を行っています。
一方、イニシエータソケット(initiator_socket)では、2つのマクロを使って、メソッドの設定を行っています。
最後に2つのメソッドをSC_THREADで登録しています。
この続きは、次回に。。。