Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

SimpleBus (その1)

Verification Engineerの戯言

unit_test/tlm/common/include/modelsディレクトリにSimpleBus.hファイルがあります。
このファイルは、マルチポート(マルチイニシエータ/マルチターゲット)対応のバスモデルです。

SimBusクラスの定義の一部は、次のようになっています
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クラスは、SimpleTargetSocketSimpleInitiatorSocketの2つのSocketを持っています。
ポートの数は、SimpleBusインスタンスにしたときに次のように指定します。
    SimpleBus bus<2,4>
この例では、SimpleInitiatorSocketの数が2で、SimpleTargetSocketの数が4です。
コンストラクタでは、各ソケットに対する設定を行っています。
ターゲットソケット(target_socket)では、3つのマクロを使って、メソッドの設定を行っています。
一方、イニシエータソケット(initiator_socket)では、2つのマクロを使って、メソッドの設定を行っています。
最後に2つのメソッドをSC_THREADで登録しています。

この続きは、次回に。。。