默认情况下,输入指针和按值传递 (pass-by-value) 实参作为简单的线型端口来实现,无关联的握手信号。例如,在 Vivado IP 流程接口 所探讨的 vadd
函数中,输入端口实现时不含 I/O 协议,仅含数据端口。如果此端口不含默认或按设计指定的 I/O 协议,那么输入数据必须保持稳定直至读取为止。
默认输出指针实现时含关联的输出有效信号,用于指示何时输出数据有效。在
vadd
函数示例中,输出端口实现时含关联的输出有效端口 (out_r_o_ap_vld
) 以指示何时端口上的数据有效并且可供读取。如果不存在与输出端口关联的 I/O 协议,那么将难以确定何时读取数据。 提示: 最好始终在输出上使用 I/O 协议。
同时支持读取和写入的函数实参将拆分为独立的输入端口和输出端口。在 vadd
函数示例中,out_r
实参是作为输入端口 out_r_i
和输出端口 out_r_o
来实现的,并具有关联的 I/O 协议端口 out_r_o_ap_vld
。
如果函数具有返回值,则实现输出端口 ap_return
以提供返回值。当 RTL 设计完成 1 项传输事务时(等同于执行 1 次 C/C++ 语言函数),块级协议会以 ap_done
信号来表明函数已完成。这也表示 ap_return
端口上的数据有效且可读。
注释: 返回顶层函数的值不能为指针。
对于所示的示例代码,时序行为如下图所示(假定目标技术和时钟频率允许每个时钟周期执行一次加法)。
图 1. 含默认综合的 RTL 端口时序
- 当
ap_start
断言为高位有效时,即开始设计。 -
ap_idle
信号断言为低位有效,表示设计正在运行中。 - 输入数据可在首个周期后的任意时钟内读取。Vitis HLS 会调度读取发生的时间。读取所有输入后,
ap_ready
信号即断言为高位有效 (High)。 - 计算输出
sum
时,关联的输出握手 (sum_o_ap_vld
) 表示数据有效。 - 当函数完成时,即断言
ap_done
有效。这也表示ap_return
上的数据有效。 - 端口
ap_idle
断言高位有效时,即表示设计正在等待再次启动。