Xilinx / libsystemctlm-soc

SystemC/TLM-2.0 Co-simulation framework
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/862421112/Co-simulation
Other
211 stars 68 forks source link

setting m_gotRspSepData=true in HandleRxDat result in TLM_GENERIC_ERROR_RESPONSE? #23

Open gxflying opened 5 months ago

gxflying commented 5 months ago

Hi sir: I am trying to integrated the chi here into a system, while I readed the implementation of the chi protocol , I found for a read transaction with seperate response (which is RespSepData and DataSepResp), if the DataSepResp comes first and we get all the data the transaction requested , the m_gotRspSepData will be set to true in HandleRxDat. this may result in a TLM_GENERIC_ERROR_RESPONSE response when the RespSepData came sometime later after the DataSepResp in cache_chi::b_transport_rxrsp ?

https://github.com/Xilinx/libsystemctlm-soc/blob/42aa8ed780cb9eef3a61bc50ea35ff079a7e6284/tlm-modules/private/chi/txns-rn.h#L477

virtual void b_transport_rxrsp(tlm::tlm_generic_payload& trans, sc_time& delay)

       {
               trans.set_response_status(tlm::TLM_GENERIC_ERROR_RESPONSE);
                .....
        ret = t->HandleRxRsp(trans, chiattr);           // return false.  see the comment blow

        m_transmitter.Process(t);
    }
       // false here,  so the trans respoonse will he TLM_GENERIC_ERROR_RESPONSE 
       //  which is set at the first line of  b_transport_rxrsp
    if (ret) {                               
        trans.set_response_status(      
            tlm::TLM_OK_RESPONSE);
    }
gxflying commented 5 months ago

because when the RespSepData comes and is handled by HandleRxRsp (with m_gotRspSepData=true being set by HandleRxDat aforementioned in the last comment )

virtual bool HandleRxRsp(tlm::tlm_generic_payload& gp,chiattr_extension *chiattr)
{
      bool acceptRspSepData = !m_gotRspSepData &&chiattr->GetOpcode() == Rsp::RespSepData;    //  false
      bool acceptReadReceipt = !m_gotRspSepData &&chiattr->GetOpcode() == Rsp::ReadReceipt;     //  false
      bool rspHandled = false;
      if (acceptRspSepData) {                         // false
          m_gotRspSepData = true;
          m_gotReadReceipt = true;
          rspHandled = true;
      } else if (acceptReadReceipt) {               // false
          m_gotReadReceipt = true;
          rspHandled = true;
      }
      return rspHandled;                               // return false eventully
}