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_axi
或s_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;
}
}
重要: 自由运行的内核不支持软件仿真。