Makefile
DEPTH := ..
-include $(DEPTH)/tools/make/common.make
-include $(DEPTH)/tree.make
ifeq ($(SYSTEMC),)
$(error SYSTEMC variable must be defined in tree.make to build Cmodel)
endif
TARGET ?= libnvdla_cmod.so
BUILD_DIR ?= $(DEPTH)/$(OUTDIR)/$(PROJECT)/$(REL_PATH_FROM_TOT)
SRC_DIR ?= $(DEPTH)/cmod
PREFIX ?=$(BUILD_DIR)/release
SYSTEMC_INC_DIR ?= $(SYSTEMC)/include
SYSTEMC_LIB_DIR ?= $(SYSTEMC)/lib-linux64
SYSTEMC_LIBRARIES ?= libsystemc-2.3.0.so
SRCS := \
$(SRC_DIR)/nvdla_payload/dla_b_transport_payload.cpp \
$(SRC_DIR)/nvdla_payload/gp_mm.cpp \
$(SRC_DIR)/bdma/NV_NVDLA_bdma.cpp \
$(SRC_DIR)/bdma/BdmaCore.cpp \
$(SRC_DIR)/bdma/gen/bdma_reg_model.cpp \
$(SRC_DIR)/cacc/NV_NVDLA_cacc.cpp \
$(SRC_DIR)/cacc/gen/cacc_reg_model.cpp \
$(SRC_DIR)/cbuf/NV_NVDLA_cbuf.cpp \
$(SRC_DIR)/cdma/NV_NVDLA_cdma.cpp \
$(SRC_DIR)/cdma/gen/cdma_reg_model.cpp \
$(SRC_DIR)/cdp/NV_NVDLA_cdp.cpp \
$(SRC_DIR)/cdp/gen/cdp_reg_model.cpp \
$(SRC_DIR)/cdp/gen/cdp_rdma_reg_model.cpp \
$(SRC_DIR)/cmac/NV_NVDLA_cmac.cpp \
$(SRC_DIR)/cmac/gen/cmac_a_reg_model.cpp \
$(SRC_DIR)/csb_master/gen/NV_NVDLA_csb_master.cpp \
$(SRC_DIR)/csc/NV_NVDLA_csc.cpp \
$(SRC_DIR)/csc/gen/csc_reg_model.cpp \
$(SRC_DIR)/cvif/gen/NV_NVDLA_cvif.cpp \
$(SRC_DIR)/glb/NV_NVDLA_glb.cpp \
$(SRC_DIR)/glb/gen/glb_reg_model.cpp \
$(SRC_DIR)/glb/gen/gec_reg_model.cpp \
$(SRC_DIR)/hls_wrapper/cdma_hls_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/cdp_hls_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/cdp_icvt_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/cdp_ocvt_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/csc_hls_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/pdp_hls_wrapper.cpp \
$(SRC_DIR)/hls_wrapper/sdp_hls_wrapper.cpp \
$(SRC_DIR)/mcif/gen/NV_NVDLA_mcif.cpp \
$(SRC_DIR)/nvdla_clibs/NvdlaDataFormatConvertor.cpp \
$(SRC_DIR)/nvdla_core/NV_NVDLA_core.cpp \
$(SRC_DIR)/nvdla_core/NvdlaCoreDummy.cpp \
$(SRC_DIR)/nvdla_top/NV_nvdla.cpp \
$(SRC_DIR)/nvdla_top/NvdlaAxiAdaptor.cpp \
$(SRC_DIR)/nvdla_top/NvdlaCsbAdaptor.cpp \
$(SRC_DIR)/nvdla_top/NvdlaTopDummy.cpp \
$(SRC_DIR)/pdp/NV_NVDLA_pdp.cpp \
$(SRC_DIR)/pdp/gen/pdp_reg_model.cpp \
$(SRC_DIR)/pdp/gen/pdp_rdma_reg_model.cpp \
$(SRC_DIR)/rubik/NV_NVDLA_rbk.cpp \
$(SRC_DIR)/rubik/gen/rbk_reg_model.cpp \
$(SRC_DIR)/sdp/NV_NVDLA_sdp.cpp \
$(SRC_DIR)/sdp/gen/sdp_reg_model.cpp \
$(SRC_DIR)/sdp/gen/sdp_rdma_reg_model.cpp \
$(SRC_DIR)/hls/cdma_libs/cdma_cvt.cpp \
$(SRC_DIR)/hls/cdp_libs/cdp_icvt.cpp \
$(SRC_DIR)/hls/cdp_libs/cdp_ocvt.cpp \
$(SRC_DIR)/hls/csc_libs/csc_cvt.cpp \
$(SRC_DIR)/hls/sdp/sdp_x.cpp \
$(SRC_DIR)/hls/sdp/sdp_y_core.cpp \
$(SRC_DIR)/hls/sdp/sdp_y_idx.cpp \
$(SRC_DIR)/hls/sdp/sdp_y_cvt.cpp \
$(SRC_DIR)/hls/sdp/sdp_c.cpp \
$(SRC_DIR)/hls/sdp/sdp_y.cpp \
$(SRC_DIR)/hls/sdp/sdp_y_inp.cpp \
$(SRC_DIR)/hls/vlibs/fp16_add.cpp \
$(SRC_DIR)/hls/vlibs/fp16_max.cpp \
$(SRC_DIR)/hls/vlibs/fp16_min.cpp \
$(SRC_DIR)/hls/vlibs/fp16_mul.cpp \
$(SRC_DIR)/hls/vlibs/fp16_sub.cpp \
$(SRC_DIR)/hls/vlibs/fp16_to_fp17.cpp \
$(SRC_DIR)/hls/vlibs/fp16_to_fp32.cpp \
$(SRC_DIR)/hls/vlibs/fp17_add.cpp \
$(SRC_DIR)/hls/vlibs/fp17_max.cpp \
$(SRC_DIR)/hls/vlibs/fp17_min.cpp \
$(SRC_DIR)/hls/vlibs/fp17_mul.cpp \
$(SRC_DIR)/hls/vlibs/fp17_sub.cpp \
$(SRC_DIR)/hls/vlibs/fp17_to_fp16.cpp \
$(SRC_DIR)/hls/vlibs/fp17_to_fp32.cpp \
$(SRC_DIR)/hls/vlibs/fp32_add.cpp \
$(SRC_DIR)/hls/vlibs/fp32_mul.cpp \
$(SRC_DIR)/hls/vlibs/fp32_sub.cpp \
$(SRC_DIR)/hls/vlibs/fp32_to_fp16.cpp \
$(SRC_DIR)/hls/vlibs/fp32_to_fp17.cpp \
$(SRC_DIR)/hls/vlibs/uint16_to_fp17.cpp \
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)
INC_DIRS := \
./include \
$(SRC_DIR)/include/nvdla_ness_header \
$(SRC_DIR)/include \
$(SRC_DIR)/nvdla_payload \
$(SRC_DIR)/bdma \
$(SRC_DIR)/cacc \
$(SRC_DIR)/cbuf \
$(SRC_DIR)/cdma \
$(SRC_DIR)/cdp \
$(SRC_DIR)/cmac \
$(SRC_DIR)/csb_master \
$(SRC_DIR)/csc \
$(SRC_DIR)/cvif \
$(SRC_DIR)/glb \
$(SRC_DIR)/hls_wrapper \
$(SRC_DIR)/mcif \
$(SRC_DIR)/nvdla_core \
$(SRC_DIR)/pdp \
$(SRC_DIR)/rubik \
$(SRC_DIR)/sdp \
$(SRC_DIR)/bdma/gen \
$(SRC_DIR)/cacc/gen \
$(SRC_DIR)/cbuf/gen \
$(SRC_DIR)/cdma/gen \
$(SRC_DIR)/cdp/gen \
$(SRC_DIR)/cmac/gen \
$(SRC_DIR)/csb_master/gen \
$(SRC_DIR)/csc/gen \
$(SRC_DIR)/cvif/gen \
$(SRC_DIR)/glb/gen \
$(SRC_DIR)/hls_wrapper/gen \
$(SRC_DIR)/mcif/gen \
$(SRC_DIR)/nvdla_core/gen \
$(SRC_DIR)/pdp/gen \
$(SRC_DIR)/rubik/gen \
$(SRC_DIR)/sdp/gen \
$(SRC_DIR)/hls/include \
$(SRC_DIR)/hls/cdma_libs \
$(SRC_DIR)/hls/cdp_libs \
$(SRC_DIR)/hls/csc_libs \
$(SRC_DIR)/hls/sdp \
$(SRC_DIR)/hls/vlibs \
$(SYSTEMC_INC_DIR)
LD_DIRS := \
$(SYSTEMC_LIB_DIR)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
LD_FLAGS := $(addprefix -L,$(LD_DIRS))
CPPFLAGS ?= $(INC_FLAGS) -MMD -MP -fPIC -Wall -Werror -DSC_INCLUDE_DYNAMIC_PROCESSES -Wp,-w -std=c++11
LDFLAGS ?= -shared $(addprefix -l,$($(notdir $(SYSTEMC_LIBRARIES)):lib%.so=%)) $(LD_FLAGS)
$(BUILD_DIR)/$(TARGET): $(OBJS)
$(GCC) $(OBJS) -o $@ $(LDFLAGS) -L$(BUILD_DIR)
default: $(BUILD_DIR)/$(TARGET) install
@echo "=============================================="
@echo "files are generated under $(TOT)/$(OUTDIR)/$(PROJECT)/$(REL_PATH_FROM_TOT)"
@echo "=============================================="
$(BUILD_DIR)/%.cpp.o: %.cpp
$(MKDIR_P) $(dir $@)
$(GCC) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
.PHONY: clean
clean:
$(RM) -r $(BUILD_DIR)
.PHONY: install
install:
$(MKDIR_P) $(PREFIX)/lib
$(MKDIR_P) $(PREFIX)/include
$(CP) $(BUILD_DIR)/$(TARGET) $(PREFIX)/lib
$(CP) $(SRC_DIR)/include/scsim_common.h $(PREFIX)/include
$(CP) $(SRC_DIR)/include/NV_nvdla_top_base.h $(PREFIX)/include
$(CP) $(SRC_DIR)/nvdla_top/NV_nvdla.h $(PREFIX)/include
@echo "=============================================="
@echo "release files are installed to $(PREFIX)"
@echo "=============================================="
-include $(DEPS)
MKDIR_P ?= mkdir -p
CP ?= cp -f
这段代码是一个用于构建NVDLA C模型的Makefile。这个Makefile定义了一系列规则和变量,用于编译、链接和安装NVDLA C模型的源代码。我会解释一些关键部分:
-
变量定义:
DEPTH
:指定了根目录的路径。TARGET
:目标文件名,默认为libnvdla_cmod.so
。BUILD_DIR
:构建目录,存放编译生成的文件。SRC_DIR
:源代码目录。
-
依赖和包含:
-include
:包含其他makefile,用于加载共享的配置选项。ifeq ($(SYSTEMC),)
:检查变量SYSTEMC
是否被定义,如果没有定义则会输出错误信息。
-
源代码文件列表
SRCS
和对象文件列表OBJS
:SRCS
:指定了所有需要编译的源代码文件的路径。OBJS
:由源代码文件列表生成的对应的目标文件路径列表。
-
编译和链接选项:
INC_DIRS
:包含所有需要的头文件路径。LD_DIRS
:包含所有需要的库文件路径。INC_FLAGS
:将INC_DIRS
转换为-I
形式的编译选项。LDFLAGS
:链接选项,包括库文件和库路径。
-
构建规则:
.cpp.o
规则:定义了将每个源文件编译为目标文件的规则。$(BUILD_DIR)/$(TARGET)
规则:定义了生成目标文件的规则,使用$(GCC)
进行链接。
-
Phony Targets:
default
:默认目标,会生成目标文件并执行install
。clean
:清理生成的文件和目录。
-
安装规则:
install
:将生成的文件和头文件安装到指定的目录。
这个Makefile的目的是将NVDLA C模型的源代码编译、链接并生成可执行文件,最后安装到指定目录。你可以使用 make
命令来运行这个Makefile,根据你的需求编译和安装NVDLA C模型。注意,在运行前需要确保 SYSTEMC
变量被正确定义,以及可能需要根据项目的实际情况进行适当的调整。
源代码文件列表 SRCS
SRCS
是一个变量,其中包含了构建 NVDLA C 模型时需要编译的所有源代码文件的路径列表。每个路径都指向一个源代码文件(通常是 .cpp
文件),这些文件共同构成了 NVDLA C 模型的实现。
以下是 SRCS
中列出的一些文件的说明:
根据你提供的源代码文件列表 SRCS
,这些文件涵盖了 NVDLA C 模型中各个功能模块的实现。
1. `dla_b_transport_payload.cpp`:处理DLA(Deep Learning Accelerator)的传输负载数据。
2. `gp_mm.cpp`:处理通用内存映射(General Purpose Memory Mapping)。
3. `NV_NVDLA_bdma.cpp`:实现BDMA(Basic Direct Memory Access)模块,用于数据传输。
4. `BdmaCore.cpp`:实现BDMA核心功能。
5. `bdma_reg_model.cpp`:实现BDMA模块的寄存器模型。
6. `NV_NVDLA_cacc.cpp`:实现CACC(Convolution Accumulator)模块,用于卷积操作。
7. `cacc_reg_model.cpp`:实现CACC模块的寄存器模型。
8. `NV_NVDLA_cbuf.cpp`:实现CBUF(Channel Buffer)模块,用于通道数据缓冲。
9. `NV_NVDLA_cdma.cpp`:实现CDMA(Channel Data Memory Access)模块,用于通道数据传输。
10. `cdma_reg_model.cpp`:实现CDMA模块的寄存器模型。
11. `NV_NVDLA_cdp.cpp`:实现CDP(Channel Data Processor)模块,用于通道数据处理。
12. `cdp_reg_model.cpp`:实现CDP模块的寄存器模型。
13. `cdp_rdma_reg_model.cpp`:实现CDP模块的RDMA(Register Direct Memory Access)寄存器模型。
14. `NV_NVDLA_cmac.cpp`:实现CMAC(Convolutional Multiply-Accumulate)模块,用于卷积计算。
15. `cmac_a_reg_model.cpp`:实现CMAC模块的A端寄存器模型。
16. `NV_NVDLA_csb_master.cpp`:实现CSB(Control Status Block)主控制模块。
17. `NV_NVDLA_csc.cpp`:实现CSC(Convolutional Scale Convolution)模块,用于卷积尺度操作。
18. `csc_reg_model.cpp`:实现CSC模块的寄存器模型。
19. `NV_NVDLA_cvif.cpp`:实现CVIF(Convolution Image Fetcher)模块,用于卷积图像获取。
20. `NV_NVDLA_glb.cpp`:实现GLB(Global Control)模块,用于全局控制。
21. `glb_reg_model.cpp`:实现GLB模块的寄存器模型。
22. `gec_reg_model.cpp`:实现GLB模块的GEC(Global Exception Control)寄存器模型。
23. `cdma_hls_wrapper.cpp`:为CDMA模块提供HLS(High-Level Synthesis)封装。
24. `cdp_hls_wrapper.cpp`:为CDP模块提供HLS封装。
25. `cdp_icvt_wrapper.cpp`:为CDP模块的输入数据提供类型转换的HLS封装。
26. `cdp_ocvt_wrapper.cpp`:为CDP模块的输出数据提供类型转换的HLS封装。
27. `csc_hls_wrapper.cpp`:为CSC模块提供HLS封装。
28. `pdp_hls_wrapper.cpp`:为PDP(Pooling Data Processor)模块提供HLS封装。
29. `sdp_hls_wrapper.cpp`:为SDP(Scale Data Processor)模块提供HLS封装。
30. `NV_NVDLA_mcif.cpp`:实现MCIF(Memory Controller Interface)模块,用于内存控制接口。
31. `NvdlaDataFormatConvertor.cpp`:实现数据格式转换功能。
32. `NV_NVDLA_core.cpp`:实现核心NVDLA功能。
33. `NvdlaCoreDummy.cpp`:提供核心NVDLA的虚拟实现。
34. `NV_nvdla.cpp`:实现顶层NVDLA模块。
35. `NvdlaAxiAdaptor.cpp`:实现AXI(Advanced eXtensible Interface)适配器。
36. `NvdlaCsbAdaptor.cpp`:实现CSB适配器。
37. `NvdlaTopDummy.cpp`:提供顶层NVDLA的虚拟实现。
38. `NV_NVDLA_pdp.cpp`:实现PDP模块,用于池化数据处理。
39. `pdp_reg_model.cpp`:实现PDP模块的寄存器模型。
40. `pdp_rdma_reg_model.cpp`:实现PDP模块的RDMA寄存器模型。
41. `NV_NVDLA_rbk.cpp`:实现RUBIK模块,用于深度神经网络推断。
42. `rbk_reg_model.cpp`:实现RUBIK模块的寄存器模型。
43. `NV_NVDLA_sdp.cpp`:实现SDP模块,用于尺度数据处理。
44. `sdp_reg_model.cpp`:实现SDP模块的寄存器模型。
45. `sdp_rdma_reg_model.cpp`:实现SDP模块的RDMA寄存器模型。
46. `cdma_cvt.cpp`:为CDMA模块提供数据转换功能。
47. `cdp_icvt.cpp`:为CDP模块的输入数据提供类型转换功能。
48. `cdp_ocvt.cpp`:为CDP模块的输出数据提供类型转换功能。
49. `csc_cvt.cpp`:为CSC模块提供数据转换功能。
50. `sdp_x.cpp`:SDP模块的x方向数据处理。
51. `sdp_y_core.cpp`:SDP模块的y方向核心数据处理。
52. `sdp_y_idx.cpp`:SDP模块的y方向索引数据处理。
53. `sdp_y_cvt.cpp`:SDP模块的y方向类型转换。
54. `sdp_c.cpp`:SDP模块的压缩数据处理。
55. `sdp_y.cpp`:SDP模块的y方向数据处理。
56. `sdp_y_inp.cpp`:SDP模块的y方向输入数据处理。
57. `fp16_add.cpp`、`fp16_max.cpp`、`fp16_min.cpp`、`fp16_mul.cpp`、`fp16_sub.cpp`、`fp16_to_fp17.cpp`、`fp16_to_fp32.cpp`、`fp17_add.cpp`、`fp17_max.cpp`、`fp17_min.cpp`、`fp17_mul.cpp`、`fp17_sub.cpp`、`fp17_to_fp16.cpp`、`fp17_to_fp32.cpp`、`fp32_add.cpp`、`fp32_mul.cpp`、`fp32_sub.cpp`、`fp32_to_fp16.cpp`、`fp32_to_fp17.cpp`、`uint16_to_fp17.cpp`:这些文件提供了不同的浮点数运算和转换函数,用于模块内的数据处理。
这些文件共同构成了 NVDLA C 模型的核心部分,实现了 NVDLA 硬件加速器中的各个功能模块。每个模块负责不同的任务,包括数据传输、计算、数据处理、寄存器模拟等。如果你对特定模块的功能或实现细节有更多疑问,可以查阅相应的源代码文件以获取更深入的了解。
每个文件对应 NVDLA 中的一个特定功能模块,例如 bdma
(数据移动引擎)、cacc
(卷积累加器)、cdp
(通道数据处理器)等等。这些文件是 NVDLA C 模型的核心组成部分,它们实现了 NVDLA 硬件加速器各个功能单元的行为模拟。
这些源代码文件的功能实现涵盖了从底层数据传输到高级神经网络层的各个方面,包括数据加载、计算、激活函数、权重更新等。在构建模型时,这些文件会被编译成目标文件,然后链接在一起,最终生成 NVDLA C 模型的可执行文件。