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_req
、mac_a2accu
、mac_b2accu
、cacc2csb_resp
、accu2sc_credit
和cacc2sdp
等。 - 类中定义了一些虚拟函数,这些函数需要在派生类中实现以完成具体的功能。
- 该类的析构函数用于释放资源。
- 代码中还注释了一个名为
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_req
、mac_a2accu
、mac_b2accu
、cacc2csb_resp
、accu2sc_credit
和cacc2sdp
等。 csb2cacc_req
、mac_a2accu
和mac_b2accu
等端口通过register_b_transport
注册了回调函数,用于处理与这些端口的通信。- 接口函数
csb2cacc_req_b_transport
、mac_a2accu_b_transport
和mac_b2accu_b_transport
用于在接收到通信请求时将请求转发给派生类。 cacc2csb_resp_b_transport
、accu2sc_credit_b_transport
和cacc2sdp_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_rd
、sc2buf_dat_rd
、sc2buf_wt_rd
、cdma2buf_dat_wr
和cdma2buf_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 的通信。
具体来说,构造函数的主要工作包括:
- 通过成员初始化列表初始化基类
sc_module
的名称。 - 初始化了以下目标 Socket 变量:
sc2buf_wmb_rd
:用于处理写入消息缓冲区(WMB)的读操作请求。sc2buf_dat_rd
:用于处理数据缓冲区(DAT)的读操作请求。sc2buf_wt_rd
:用于处理权重缓冲区(WT)的读操作请求。cdma2buf_dat_wr
:用于处理来自 CDMA 模块的数据缓冲区的写入请求。cdma2buf_wt_wr
:用于处理来自 CDMA 模块的权重缓冲区的写入请求。
- 注册了这些目标 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 的回调函数。这些回调函数用于将泛型事务的数据指针转换为特定的数据类型,然后调用对应的处理函数来处理通信请求。
具体来说,这些回调函数的作用如下:
-
sc2buf_wmb_rd_b_transport
:处理写入消息缓冲区(WMB)的读操作请求。它将泛型事务的数据指针转换为nvdla_ram_rd_valid_port_RADDR_8_RDATA_1024_t*
类型,并调用sc2buf_wmb_rd_b_transport
处理实际请求。 -
sc2buf_dat_rd_b_transport
:处理数据缓冲区(DAT)的读操作请求。它将泛型事务的数据指针转换为nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t*
类型,并调用sc2buf_dat_rd_b_transport
处理实际请求。 -
sc2buf_wt_rd_b_transport
:处理权重缓冲区(WT)的读操作请求。它将泛型事务的数据指针转换为nvdla_ram_rd_valid_port_RADDR_12_RDATA_1024_t*
类型,并调用sc2buf_wt_rd_b_transport
处理实际请求。 -
cdma2buf_dat_wr_b_transport
:处理来自 CDMA 模块的数据缓冲区的写入请求。它将泛型事务的数据指针转换为nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t*
类型,并调用cdma2buf_dat_wr_b_transport
处理实际请求。 -
cdma2buf_wt_wr_b_transport
:处理来自 CDMA 模块的权重缓冲区的写入请求。它将泛型事务的数据指针转换为nvdla_ram_wr_port_WADDR_12_WDATA_512_BE_1_t*
类型,并调用cdma2buf_wt_wr_b_transport
处理实际请求。
这些回调函数的主要作用是将通信请求分派给适当的处理函数,以完成实际的读写操作。这些回调函数的具体实现应在派生类中完成。