端口级 I/O 协议 - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese
重要: Vitis 内核流程中定义的接口的端口级 I/O 协议是由设计所设置的,一般不应对其进行修改。

默认情况下,输入指针和按值传递 (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 断言高位有效时,即表示设计正在等待再次启动。