阵列接口 - 2021.2 Chinese

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

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

INTERFACE 编译指示或指令允许您显式定义要搭配 storage_type=<value> 选项使用的 RAM 或 ROM 的类型。这样即可定义创建哪些端口(单端口或双端口)。如果不指定 storage_type,那么 Vitis HLS 会使用:

  • 单端口 RAM(默认情况下)。
  • 双端口 RAM,前提是这样可缩短启动时间间隔或减少时延。

ARRAY_PARTITION 和 ARRAY_RESHAPE 编译指示可重配置接口上的阵列。阵列可分区为多个较小的阵列,并在其各自接口上单独实现。这包括能够将阵列的每个元素分区到其自己的标量元素中。在函数接口上,这导致阵列中每个元素都有专用的端口。由此可提供最大限度并行访问,但会造成端口数量剧增,可能在实现期间导致布线问题。

默认情况下,以下代码示例中所示的函数中的阵列实参将综合到单端口 RAM 接口中。


#include "array_RAM.h"

void array_RAM (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
 int i;

 For_Loop: for (i=0;i<4;i++) {
 d_o[i] = d_i[idx[i]];
 }

}

使用单端口 RAM 接口的原因是因为 for-loop 可确保在每个时钟周期内仅读写 1 个元素。使用双端口 RAM 接口并无任何优势。

如果展开 for 循环,那么 Vitis HLS 会使用双端口 RAM。这样即可支持同时读取多个元素,从而缩短启动时间间隔。通过应用 INTERFACE 编译指示或指令并设置 storage_type 即可显式设置 RAM 接口的类型。

接口上阵列相关问题通常与吞吐量有关。可通过最优化指令来处理这些问题。例如,如果以上示例中的阵列分区到各独立元素中,并且展开 for-loop,那么即可同时访问每个阵列中的全部 4 个元素。

您还可以使用 INTERFACE 编译指示或指令和 latency=<value> 选项来指定 RAM 时延。这样 Vitis HLS 即可对接口处时延大于 1 的外部 SRAM 进行建模。