定义 SystemC 模型的过程步骤如下:
- 包含头文件:"xtlm_ap_ctrl.h" 和 "xtlm.h"。
- 基于支持的内核类型(如
ap_ctrl_chain
、ap_ctrl_hs
等),从预定义的类衍生出内核。 - 声明并定义内核上使用的 AXI 接口。
- 添加所需的内核实参,其中包含正确的地址偏移和大小。
- 在
main()
线程中写入内核主体。
以下代码示例演示了此过程。
创建 SystemC 模型时,基于受支持的控制协议(如 xtlm_ap_ctrl_chain
、xtlm_ap_ctrl_hs
和 xtlm_ap_ctrl_none
)从类衍生出内核。请使用以下结构来创建 SystemC 模型。
提示: 以下示例基于简单矢量加法 (VADD) 设计示例,您可从 GitHub 上的 Vitis_Accel_Examples 中找到该示例。
#include "xtlm.h"
#include "xtlm_ap_ctrl.h"
class vadd : public xsc::xtlm_ap_ctrl_hs
{
public:
SC_HAS_PROCESS(vadd);
vadd(sc_module_name name, xsc::common_cpp::properties& _properties):
xsc::xtlm_ap_ctrl_hs(name)
{
DEFINE_XTLM_AXIMM_MASTER_IF(in1, 32);
DEFINE_XTLM_AXIMM_MASTER_IF(in2, 32);
DEFINE_XTLM_AXIMM_MASTER_IF(out_r, 32);
ADD_MEMORY_IF_ARG(in1, 0x10, 0x8);
ADD_MEMORY_IF_ARG(in2, 0x18, 0x8);
ADD_MEMORY_IF_ARG(out_r, 0x20, 0x8);
ADD_SCALAR_ARG(size, 0x28, 0x4);
SC_THREAD(main_thread);
}
//! Declare aximm interfaces..
DECLARE_XTLM_AXIMM_MASTER_IF(in1);
DECLARE_XTLM_AXIMM_MASTER_IF(in2);
DECLARE_XTLM_AXIMM_MASTER_IF(out_r);
//! Declare scalar args...
unsigned int size;
void main_thread()
{
wait(ev_ap_start); //! Wait on ap_start event...
//! Copy kernel args configured by host...
uint64_t in1_base_addr = kernel_args[0];
uint64_t in2_base_addr = kernel_args[1];
uint64_t out_r_base_addr = kernel_args[2];
size = kernel_args[3];
unsigned data1, data2, data_r;
for(int i = 0; i < size; i++) {
in1->read(in1_base_addr + (i*4), (unsigned char*)&data1); //! Read from in1 interface
in2->read(in2_base_addr + (i*4), (unsigned char*)&data2); //! Read from in2 interface
//! Add data1 & data2 and write back result
data_r = data1 + data2; //! Add
out_r->write(out_r_base_addr + (i*4), (unsigned char*)&data_r); //! Write the result
}
ap_done(); //! completed Kernel computation...
}
};
包含的文件位于 Vitis 安装层级的 $XILINX_Vivado/data/systemc/simlibs/ 文件夹下。
内核名称是在为 SystemC 模型定义类时指定的(如上所述),继承自 xtlm_ap_ctrl_hs
类。
您必须声明并定义与内核实参关联的 AXI 接口,如以下结构所示:
DECLARE_XTLM_AXIMM_MASTER_IF(in1);
DEFINE_XTLM_AXIMM_MASTER_IF(in1, 32);
声明会将接口类型与实参相关联。定义则用于定义此接口的数据宽度。您还必须声明内核实参的寄存器偏移和大小,如下所示:
ADD_MEMORY_IF_ARG(in1, 0x10, 0x8);
指定内核实参、偏移和大小时,这些值应与 XRT 管理的内核的 AXI4-Lite 接口中反映的值相匹配,如 软件可控内核 和 XRT 管理的内核的控制要求 中所述。
低于 0x10
的地址为保留地址,供 XRT 用于管理内核执行。内核实参可从 0x10
开始向上指定。最重要的是,SystemC 模型中指定的实参、偏移和大小应与 Vitis HLS 或 RTL 内核中使用的值相匹配。
内核是在 SystemC main_thread
中执行的。此线程会等待至主机应用或 XRT 的 ap_start
位完成置位后才开始执行,届时内核即可按如下方式处理实参值:
- 内核等待来自 XRT (
ev_ap_start
) 的开始信号。 - 将内核实参映射至 SystemC 模型中的变量。
- 读取输入。
- 添加矢量并捕获结果。
- 将输出写回主机。
- 将完成信号发送给 XRT (
ap_done
)。