对 SystemC 模型进行编码 - 2023.2 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 简体中文

定义 SystemC 模型的过程步骤如下:

  1. 包含头文件:"xtlm_ap_ctrl.h""xtlm.h"
  2. 基于支持的内核类型(如 ap_ctrl_chainap_ctrl_hs 等),从预定义的类衍生出内核。
  3. 声明并定义内核上使用的 AXI 接口。
  4. 添加所需的内核实参,其中包含正确的地址偏移和大小。
  5. main() 线程中写入内核主体。

以下代码示例演示了此过程。

创建 SystemC 模型时,基于受支持的控制协议(如 xtlm_ap_ctrl_chainxtlm_ap_ctrl_hsxtlm_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 位完成置位后才开始执行,届时内核即可按如下方式处理实参值:

  1. 内核等待来自 XRT (ev_ap_start) 的开始信号。
  2. 将内核实参映射至 SystemC 模型中的变量。
  3. 读取输入。
  4. 添加矢量并捕获结果。
  5. 将输出写回主机。
  6. 将完成信号发送给 XRT (ap_done)。