Vengineerの妄想(準備期間)

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

SimpleBus (その6)

Verification Engineerの戯言

SimpleTLInitiator2(_DMI)クラスSimpleTLInitiator1(_DMI)クラスの違いは、
SimpleTLInitiator1(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承するのに、
SimpleTLInitiator2(_DMI)クラスは、tlm::tlm_bw_nb_transport_ifクラスを継承しません。
そのため、ターゲット側から呼ばれるnb_transportメソッドの扱いが違います。
SimpleTLInitiator2(_DMI)クラスでは、コンストラクタ内でREGISTER_NBTRANSPORTマクロを使って、
socketに対応するメソッド(ここでは、myNBTransport)を対応させます。
myNBTransportメソッドの内容は、SimpleLTInitiator1(_DMI)クラスnb_transportメソッドと同じになります。
  SimpleLTInitiator2(sc_core::sc_module_name name,
                     unsigned int nrOfTransactions = 0x5,
                     unsigned int baseAddress = 0x0) :
    sc_core::sc_module(name),
    socket("socket"),
    mNrOfTransactions(nrOfTransactions),
    mBaseAddress(baseAddress),
    mTransactionCount(0)
  {
    // register nb_transport method
    REGISTER_NBTRANSPORT(socket, myNBTransport);

    // Initiator thread
    SC_THREAD(run);
  }

  sync_enum_type myNBTransport(transaction_type& trans, phase_type& phase, sc_core::sc_time& t)
  {
    switch (phase) {
    case tlm::END_REQ:
      // Request phase ended
      return tlm::TLM_ACCEPTED;

    case tlm::BEGIN_RESP:
      assert(t == sc_core::SC_ZERO_TIME); // FIXME: can t != 0?
      mEndEvent.notify(t);
      // Not needed to update the phase if true is returned
      return tlm::TLM_COMPLETED;

    case tlm::BEGIN_REQ: // fall-through
    case tlm::END_RESP: // fall-through
    default:
      // A target should never call nb_transport with these phases
      assert(0); exit(1);
      return tlm::TLM_REJECTED;
    };
  }

さて、次回は残っているSimpleTLInitiator3(_DMI)クラスです。