HLS Direct IO的介绍

作者:Yang Chen,AMD工程师;来源:AMD开发者社区

背景:持续运行内核是一种硬件内核设计,旨在持续运行,直到发生复位事件为止。这与传统的软件加速内核不同,后者在被调用时执行任务,完成后即返回。对于持续运行的内核,由于其始终处于运行状态,无法像通常那样在执行过程中修改其参数(标量参数和内存偏移量)。为了能动态修改持续运行内核的参数, Vitis HLS 提供了 Direct I/O 类 (hls::direct_io)。

Vitis HLS 提供了一个C++模板hls::direct_io用于在执行中修改kernel标量/内存偏移参数。当然如果要使用Direct IO需要注意几点:

1. hls::direct_io 只能用于顶层函数。对于整个kernel来说,参数变化来自于上位机。对于子函数,参数并不直接来自于上位机,而是层层传递,所以无法直接使用Direct IO。

2. Direct IO支持所有的port-level协议,例如ap_none, ap_hs, ap_ack and ap_vld

ap_none:最简单的IO协议,只包含数据端口。

ap_hs:handshakes,具有握手协议,包含acknowledge(确认)信号和valid(有效)信号。

ap_ack和ap_vld是ap_hs的子集,分别只有acknowledge信号和只有valid信号。

3. Direct IO stream可以使用阻塞和非阻塞调用进行读写。

4. Direct IO stream 代码跟HLS stream很类似,但是它们是基于wire类型的端口协议,并没有使用FIFO实现。

如果要使用Direct IO stream,首先要在你的源文件里面包含Direct IO 的头文件:

#include "hls_directio.h"

包含头文件后,您可以通过选择合适的端口级协议来定义直接 I/O 对象。这些协议决定了Direct  I/O  stream如何与系统设计中的其他组件交互。具体可以参照以下:

#include "hls_directio.h"

hls::ap_none<int> &value_1,

hls::ap_hs<float>   &value_2,

hls::ap_ack<char> &value_3,

hls::ap_vld<short> &value_4,