NVDLA系列之C-model:include<112>

cmod/include/NV_NVDLA_cacc_base.h

// File Name: NV_NVDLA_cacc_base.h

#ifndef _NV_NVDLA_CACC_BASE_H_
#define _NV_NVDLA_CACC_BASE_H_

#define SC_INCLUDE_DYNAMIC_PROCESSES
#include "NV_MSDEC_csb2xx_16m_secure_be_lvl_iface.h"
#include "nvdla_xx2csb_resp_iface.h"

#include "nvdla_accu2pp_if_iface.h"
#include "nvdla_cc_credit_iface.h"
#include "nvdla_mac2accu_if_iface.h"
#include "scsim_common.h"
#include <systemc.h>
#include <tlm.h>
#include <tlm_utils/multi_passthrough_initiator_socket.h>
#include <tlm_utils/multi_passthrough_target_socket.h>

SCSIM_NAMESPACE_START(cmod)

这段代码定义了一个名为 NV_NVDLA_cacc_base 的 SystemC 类,该类是模块 NV_NVDLA_cacc 的基础类。以下是对该代码段的注释和总结:

// Base SystemC class for module NV_NVDLA_cacc
class NV_NVDLA_cacc_base : public sc_module
{
    public:

    // Constructor
    NV_NVDLA_cacc_base(const sc_module_name name);

    // Target Socket (unrecognized protocol: NV_MSDEC_csb2xx_16m_secure_be_lvl_t): csb2cacc_req
    tlm_utils::multi_passthrough_target_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> csb2cacc_req;
    virtual void csb2cacc_req_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay);
    virtual void csb2cacc_req_b_transport(int ID, NV_MSDEC_csb2xx_16m_secure_be_lvl_t* payload, sc_time& delay) = 0;

    // Target Socket (unrecognized protocol: nvdla_mac2accu_data_if_t): mac_a2accu
    tlm_utils::multi_passthrough_target_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> mac_a2accu;
    virtual void mac_a2accu_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay);
    virtual void mac_a2accu_b_transport(int ID, nvdla_mac2accu_data_if_t* payload, sc_time& delay) = 0;

    // Target Socket (unrecognized protocol: nvdla_mac2accu_data_if_t): mac_b2accu
    tlm_utils::multi_passthrough_target_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> mac_b2accu;
    virtual void mac_b2accu_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay);
    virtual void mac_b2accu_b_transport(int ID, nvdla_mac2accu_data_if_t* payload, sc_time& delay) = 0;

    // Initiator Socket (unrecognized protocol: nvdla_xx2csb_resp_t): cacc2csb_resp
    tlm::tlm_generic_payload cacc2csb_resp_bp;
    nvdla_xx2csb_resp_t cacc2csb_resp_payload;
    tlm_utils::multi_passthrough_initiator_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> cacc2csb_resp;
    virtual void cacc2csb_resp_b_transport(nvdla_xx2csb_resp_t* payload, sc_time& delay);

    // Initiator Socket (unrecognized protocol: nvdla_cc_credit_t): accu2sc_credit
    tlm::tlm_generic_payload accu2sc_credit_bp;
    nvdla_cc_credit_t accu2sc_credit_payload;
    tlm_utils::multi_passthrough_initiator_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> accu2sc_credit;
    virtual void accu2sc_credit_b_transport(nvdla_cc_credit_t* payload, sc_time& delay);

    // Initiator Socket (unrecognized protocol: nvdla_accu2pp_if_t): cacc2sdp
    tlm::tlm_generic_payload cacc2sdp_bp;
    nvdla_accu2pp_if_t cacc2sdp_payload;
    tlm_utils::multi_passthrough_initiator_socket<NV_NVDLA_cacc_base, 32, tlm::tlm_base_protocol_types> cacc2sdp;
    virtual void cacc2sdp_b_transport(nvdla_accu2pp_if_t* payload, sc_time& delay);

    // Port has no flow: cacc2glb_done_intr
    // sc_vector< sc_out<bool> > cacc2glb_done_intr;

    // Destructor
    virtual ~NV_NVDLA_cacc_base() {}

};

总结:

  • NV_NVDLA_cacc_base 是用于 NV_NVDLA_cacc 模块的基础 SystemC 类。
  • 该类包含多个成员变量,其中包括多个 TLM(Transaction Level Modeling)的通信端口,这些端口用于模块与其他模块之间的通信。
  • 这些端口包括 csb2cacc_reqmac_a2accumac_b2accucacc2csb_respaccu2sc_creditcacc2sdp 等。
  • 类中定义了一些虚拟函数,这些函数需要在派生类中实现以完成具体的功能。
  • 该类的析构函数用于释放资源。
  • 代码中还注释了一个名为 cacc2glb_done_intr 的端口,但未给出详细定义。

这个基础类提供了通信接口和虚拟函数,使得派生类可以继承这些接口并实现具体的逻辑,以完成 NV_NVDLA_cacc 模块的功能。

这段代码是 NV_NVDLA_cacc_base 类的构造函数和一些成员函数的实现。以下是对这些函数的注释和总结:

// Constructor for base SystemC class for module NV_NVDLA_cacc
inline NV_NVDLA_cacc_base::NV_NVDLA_cacc_base(const sc_module_name name)
    : sc_module(name),
    csb2cacc_req("csb2cacc_req"),
    mac_a2accu("mac_a2accu"),
    mac_b2accu("mac_b2accu"),
    cacc2csb_resp_bp(),
    cacc2csb_resp("cacc2csb_resp"),
    accu2sc_credit_bp(),
    accu2sc_credit("accu2sc_credit"),
    cacc2sdp_bp(),
    cacc2sdp("cacc2sdp")
    //cacc2glb_done_intr("cacc2glb_done_intr", 2)
{
    // Target Socket (unrecognized protocol: NV_MSDEC_csb2xx_16m_secure_be_lvl_t): csb2cacc_req
    this->csb2cacc_req.register_b_transport(this, &NV_NVDLA_cacc_base::csb2cacc_req_b_transport);

    this->mac_a2accu.register_b_transport(this, &NV_NVDLA_cacc_base::mac_a2accu_b_transport);
    this->mac_b2accu.register_b_transport(this, &NV_NVDLA_cacc_base::mac_b2accu_b_transport);
    // Target Socket (unrecognized protocol: nvdla_mac2accu_data_if_t): mac2accu
    // this->mac2accu.register_b_transport(this, &NV_NVDLA_cacc_base::mac2accu_b_transport);

}

inline void
NV_NVDLA_cacc_base::csb2cacc_req_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    NV_MSDEC_csb2xx_16m_secure_be_lvl_t* payload = (NV_MSDEC_csb2xx_16m_secure_be_lvl_t*) bp.get_data_ptr();
    csb2cacc_req_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cacc_base::mac_a2accu_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    nvdla_mac2accu_data_if_t* payload = (nvdla_mac2accu_data_if_t*) bp.get_data_ptr();
    mac_a2accu_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cacc_base::mac_b2accu_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    nvdla_mac2accu_data_if_t* payload = (nvdla_mac2accu_data_if_t*) bp.get_data_ptr();
    mac_b2accu_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cacc_base::cacc2csb_resp_b_transport(nvdla_xx2csb_resp_t* payload, sc_time& delay)
{
    cacc2csb_resp_bp.set_data_ptr((unsigned char*) payload);
    for (uint8_t socket_id=0; socket_id < cacc2csb_resp.size(); socket_id++) {
        cacc2csb_resp[socket_id]->b_transport(cacc2csb_resp_bp, delay);
    }
}

inline void
NV_NVDLA_cacc_base::accu2sc_credit_b_transport(nvdla_cc_credit_t* payload, sc_time& delay)
{
    accu2sc_credit_bp.set_data_ptr((unsigned char*) payload);
    for (uint8_t socket_id=0; socket_id < accu2sc_credit.size(); socket_id++) {
        accu2sc_credit[socket_id]->b_transport(accu2sc_credit_bp, delay);
    }
}

inline void
NV_NVDLA_cacc_base::cacc2sdp_b_transport(nvdla_accu2pp_if_t* payload, sc_time& delay)
{
    cacc2sdp_bp.set_data_ptr((unsigned char*) payload);
    for (uint8_t socket_id=0; socket_id < cacc2sdp.size(); socket_id++) {
        cacc2sdp[socket_id]->b_transport(cacc2sdp_bp, delay);
    }
}

SCSIM_NAMESPACE_END()

总结:

  • NV_NVDLA_cacc_base 类的构造函数用于初始化类的成员变量和注册通信端口的回调函数。
  • 构造函数中的成员变量包括 csb2cacc_reqmac_a2accumac_b2accucacc2csb_respaccu2sc_creditcacc2sdp 等。
  • csb2cacc_reqmac_a2accumac_b2accu 等端口通过 register_b_transport 注册了回调函数,用于处理与这些端口的通信。
  • 接口函数 csb2cacc_req_b_transportmac_a2accu_b_transportmac_b2accu_b_transport 用于在接收到通信请求时将请求转发给派生类。
  • cacc2csb_resp_b_transportaccu2sc_credit_b_transportcacc2sdp_b_transport 用于将数据通过相应的通信端口传输给其他模块。

这些函数的具体实现和逻辑需要在 NV_NVDLA_cacc 模块的派生类中完成,以完成该模块的功能。

cmod/include/NV_NVDLA_cbuf_base.h

// File Name: NV_NVDLA_cbuf_base.h

#ifndef _NV_NVDLA_CBUF_BASE_H_
#define _NV_NVDLA_CBUF_BASE_H_

#define SC_INCLUDE_DYNAMIC_PROCESSES

#include "nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_iface.h"
#include "nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_iface.h"
#include "nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_iface.h"
#include "scsim_common.h"
#include <systemc.h>
#include <tlm.h>
#include <tlm_utils/multi_passthrough_target_socket.h>

这段代码是 NV_NVDLA_cbuf_base 类的声明,它定义了一个 SystemC 模块的基类。以下是对这个类的主要成员和函数的注释和总结:

// Constructor for base SystemC class for module NV_NVDLA_cbuf
inline NV_NVDLA_cbuf_base::NV_NVDLA_cbuf_base(const sc_module_name name)
    : sc_module(name),
    sc2buf_wmb_rd("sc2buf_wmb_rd"),
    sc2buf_dat_rd("sc2buf_dat_rd"),
    sc2buf_wt_rd("sc2buf_wt_rd"),
    cdma2buf_dat_wr("cdma2buf_dat_wr"),
    cdma2buf_wt_wr("cdma2buf_wt_wr")
{
    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t): sc2buf_wmb_rd
    this->sc2buf_wmb_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_wmb_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t): sc2buf_dat_rd
    this->sc2buf_dat_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_dat_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t): sc2buf_wt_rd
    this->sc2buf_wt_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_wt_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t): cdma2buf_dat_wr
    this->cdma2buf_dat_wr.register_b_transport(this, &NV_NVDLA_cbuf_base::cdma2buf_dat_wr_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t): cdma2buf_wt_wr
    this->cdma2buf_wt_wr.register_b_transport(this, &NV_NVDLA_cbuf_base::cdma2buf_wt_wr_b_transport);
}

// ...

总结:

  • NV_NVDLA_cbuf_base 类是一个 SystemC 模块的基类,它提供了一些基本的成员和接口。
  • 在构造函数中,它初始化了一些成员变量,其中包括 sc2buf_wmb_rdsc2buf_dat_rdsc2buf_wt_rdcdma2buf_dat_wrcdma2buf_wt_wr 等。
  • 每个成员变量都是一个多路复用的目标 Socket(tlm_utils::multi_passthrough_target_socket),并通过 register_b_transport 注册了回调函数,用于处理与这些端口的通信。
  • 派生类应该继承该基类,并实现相应的回调函数以完成具体的功能。
  • 该基类没有提供析构函数,因为 SystemC 模块的生命周期通常由 SystemC 运行时管理。

// Constructor for base SystemC class for module NV_NVDLA_cbuf
inline NV_NVDLA_cbuf_base::NV_NVDLA_cbuf_base(const sc_module_name name)
    : sc_module(name),
    sc2buf_wmb_rd("sc2buf_wmb_rd"),
    sc2buf_dat_rd("sc2buf_dat_rd"),
    sc2buf_wt_rd("sc2buf_wt_rd"),
    cdma2buf_dat_wr("cdma2buf_dat_wr"),
    cdma2buf_wt_wr("cdma2buf_wt_wr")
{
    
    
    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t): sc2buf_wmb_rd
    this->sc2buf_wmb_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_wmb_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t): sc2buf_dat_rd
    this->sc2buf_dat_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_dat_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t): sc2buf_wt_rd
    this->sc2buf_wt_rd.register_b_transport(this, &NV_NVDLA_cbuf_base::sc2buf_wt_rd_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t): cdma2buf_dat_wr
    this->cdma2buf_dat_wr.register_b_transport(this, &NV_NVDLA_cbuf_base::cdma2buf_dat_wr_b_transport);

    // Target Socket (unrecognized protocol: nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t): cdma2buf_wt_wr
    this->cdma2buf_wt_wr.register_b_transport(this, &NV_NVDLA_cbuf_base::cdma2buf_wt_wr_b_transport);

}

这是 NV_NVDLA_cbuf_base 类的构造函数的实现。它初始化了该类的成员变量,并且注册了一系列目标 Socket 的回调函数,以便处理来自这些 Socket 的通信。

具体来说,构造函数的主要工作包括:

  1. 通过成员初始化列表初始化基类 sc_module 的名称。
  2. 初始化了以下目标 Socket 变量:
    • sc2buf_wmb_rd:用于处理写入消息缓冲区(WMB)的读操作请求。
    • sc2buf_dat_rd:用于处理数据缓冲区(DAT)的读操作请求。
    • sc2buf_wt_rd:用于处理权重缓冲区(WT)的读操作请求。
    • cdma2buf_dat_wr:用于处理来自 CDMA 模块的数据缓冲区的写入请求。
    • cdma2buf_wt_wr:用于处理来自 CDMA 模块的权重缓冲区的写入请求。
  3. 注册了这些目标 Socket 的回调函数,以便在收到通信请求时执行相应的处理操作。

总之,这段代码设置了 NV_NVDLA_cbuf_base 类的基本结构,使其可以处理与写入消息缓冲区、数据缓冲区和权重缓冲区相关的通信请求。派生类应该继承这个基类,并实现适当的回调函数来完成具体的功能。

inline void
NV_NVDLA_cbuf_base::sc2buf_wmb_rd_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    
    
    nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t* payload = (nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t*) bp.get_data_ptr();
    sc2buf_wmb_rd_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cbuf_base::sc2buf_dat_rd_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    
    
    nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t* payload = (nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t*) bp.get_data_ptr();
    sc2buf_dat_rd_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cbuf_base::sc2buf_wt_rd_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    
    
    nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t* payload = (nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t*) bp.get_data_ptr();
    sc2buf_wt_rd_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cbuf_base::cdma2buf_dat_wr_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    
    
    nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t* payload = (nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t*) bp.get_data_ptr();
    cdma2buf_dat_wr_b_transport(ID, payload, delay);
}

inline void
NV_NVDLA_cbuf_base::cdma2buf_wt_wr_b_transport(int ID, tlm::tlm_generic_payload& bp, sc_time& delay)
{
    
    
    nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t* payload = (nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t*) bp.get_data_ptr();
    cdma2buf_wt_wr_b_transport(ID, payload, delay);
}

这些代码段实现了 NV_NVDLA_cbuf_base 类中各个目标 Socket 的回调函数。这些回调函数用于将泛型事务的数据指针转换为特定的数据类型,然后调用对应的处理函数来处理通信请求。

具体来说,这些回调函数的作用如下:

  1. sc2buf_wmb_rd_b_transport:处理写入消息缓冲区(WMB)的读操作请求。它将泛型事务的数据指针转换为 nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t* 类型,并调用 sc2buf_wmb_rd_b_transport 处理实际请求。

  2. sc2buf_dat_rd_b_transport:处理数据缓冲区(DAT)的读操作请求。它将泛型事务的数据指针转换为 nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t* 类型,并调用 sc2buf_dat_rd_b_transport 处理实际请求。

  3. sc2buf_wt_rd_b_transport:处理权重缓冲区(WT)的读操作请求。它将泛型事务的数据指针转换为 nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t* 类型,并调用 sc2buf_wt_rd_b_transport 处理实际请求。

  4. cdma2buf_dat_wr_b_transport:处理来自 CDMA 模块的数据缓冲区的写入请求。它将泛型事务的数据指针转换为 nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t* 类型,并调用 cdma2buf_dat_wr_b_transport 处理实际请求。

  5. cdma2buf_wt_wr_b_transport:处理来自 CDMA 模块的权重缓冲区的写入请求。它将泛型事务的数据指针转换为 nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t* 类型,并调用 cdma2buf_wt_wr_b_transport 处理实际请求。

这些回调函数的主要作用是将通信请求分派给适当的处理函数,以完成实际的读写操作。这些回调函数的具体实现应在派生类中完成。

猜你喜欢

转载自blog.csdn.net/lincolnjunior_lj/article/details/135017367
112