自由运行的内核 - 2023.2 简体中文

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

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

Vitis 核开发套件不仅能为 PL 内核上的串流接口提供支持,它还支持一种特殊种类的数据驱动内核,称为自由运行的内核。自由运行的内核没有控制信号端口,没有与软件应用交互的机制,并且无法手动启动或停止。自由运行的内核具有如下特征:

  • 如果通过二进制容器 (xclbin) 对器件进行编程,那么自由运行的内核会自动开始运行,无需从软件应用启动。
  • 没有存储器输入或输出端口,因此仅通过输入或输出串流来与其他内核进行交互
  • 一旦接收到数据,内核就会立即对串流数据进行操作,一旦数据不可用,内核就会立即停滞。

自由运行的内核的主要优势在于其不遵循 C 语言语义,即所有函数都应执行相同的次数。这种建模样式更类似于 RTL 设计,如以下示例中所示。编译器对内核进行建模,以在先前函数调用完成后自动重启。此功能类似于软件代码中的 while(1) 循环,但是无需在内核代码中指定循环。

自由运行的内核仅包含 hls::stream 输入和输出。编码准则建议包括:

  • 针对内核接口使用 hls::stream<ap_axiu<D,0,0,0> >
  • 函数参数的 hls::stream 数据类型会导致 Vitis HLS 为接口推断 AXI4‑Stream 端口 (axis)。
  • 内核仅支持串流接口 (axis)。它不应使用 m_axis_axilite 接口,如以下示例中所示。
  • 自由运行的内核还必须使用 INTERFACE 编译指示指定以下块控制协议。
    #pragma HLS interface ap_ctrl_none port=return
    提示: 这将创建不含控制信号或 AXI4‑Lite 接口的内核。这种建模方法称为自由运行的内核,因为它没有任何控制握手,它将自动启动并持续运行。如果内核需要与软件应用进行某种程度的交互,请考虑使用自动重启内核,如 Vitis 高层次综合用户指南(UG1399) 中所述。

以下代码示例显示的是包含一项输入和一项输出的自由运行的内核,该内核与另一个内核进行通信。

void increment(hls::stream<ap_axiu<32, 0, 0, 0> >& input, 
   hls::stream<ap_axiu<32, 0, 0, 0> >& output){
#pragma HLS interface ap_ctrl_none port = return
   ap_axiu<32, 0, 0, 0> v = input.read();
   v.data = v.data + 1;
   output.write(v);
   if (v.last){
      break;
   }
}
重要: 自由运行的内核不支持软件仿真。