VSC 支持的指南宏允许加速器类中的函数实参(包括 PE 和 compute)使用各种类型的硬件接口。以下提供了不同类型的指南宏的定义:
- SYS_CLOCK_ID(<PE-name>, <clock-ID>);
-
-
<PE-name>
用于指定在compute()
函数主体中例化的处理元素函数。 -
<clock-ID>
是整数值,表示此平台支持的任意时钟,可用于用户逻辑分区内的连接。指定该宏时,内核实现将使用内核对应的时钟信号线。platforminfo
命令用于查找平台的可用时钟 ID。
提示: 当 2 个 PE 通过 AXI-Stream 连接时,如果这些 PE 标记为自由运行,那么时钟 ID 可能有所不同。在此情况下,VSC 将自动插入时钟域交汇 (CDC) 连接用于这些 PE 之间的数据传输。当自由运行的 PE 连接到非自由运行的 PE 时,这 2 个 PE 需要相同的时钟 ID。 -
- SYS_PORT(<port>, <global_memory>);
-
指定用于
compute()
函数的给定实参的平台接口。全局存储器通常是存储体,用于往来 FPGA 的数据传输。-
<port>
表示特定compute()
实参的名称。 -
<global_memory>
可使用以下任一形式来指定。-
<bank-ID>
:适用于所有 CU 实例的单个 bank ID。例如,DDR、DDR[1] 或 HBM[5]。platforminfo
命令可用于查找平台的 bank 名称。重要: 请注意以下限制:- 仅限 X3 混合平台 (xilinx_x3522p*) 才支持主机存储器 (HOST[0])
- 不支持指定存储体范围(例如,HBM[0:3])
- 不支持指定 PLRAM
-
(
<CU1-bank-ID>:<CU2-bank-ID>:...:<NCU-bank-ID>
):每个 CU 的 bank ID 列表,ID 间以冒号分隔,列表以括号括起。对于每个 CU,bank-ID 是按数字顺序指定的,但不包含 CU 名称:(HBM[0]:HBM[4]:HBM[8]:HBM[12])
。条目数必须与 (/*NCU=*/4
) 类中指定的 CU 数量相匹配。
-
-
- SYS_PORT_PFM(<substr>, <port>, <global_memory>);
-
可用于为特定平台配置加速器端口连接,但通过单一类报头来定义。例如,在以下给定代码中,port-A 对于 u50 平台将连接到 HBM[0],对于所有其他平台则连接到 DDR[0]。
SYS_PORT(A, DDR[0]); SYS_PORT_PFM(u50, A, HBM[0]);
-
<substr>
表示平台名称的子字符串。例如,仅当平台名称包含指定字符串时,使用u50
才会采用SYS_PORT_PFM
连接。 - 对于
SYS_PORT
宏,<port>
和<global_memory>
实参的使用方式如上所述。
重要: 针对同一个<port>
提供多个SYS_PORT
和SYS_PORT_PFM
宏时,VSC 将应用所读取的最后一个适合的SYS_PORT
或SYS_PORT_PFM
指南宏。 -
- ACCESS_PATTERN(<port>, <pattern>);
-
启用 VSC 以推断器件内的硬件加速器接口与全局存储器之间的数据移动器。
-
<port>
表示特定compute()
实参的名称。 -
<pattern>
用于定义任一存储器访问模式,有如下两种模式:-
SEQUENTIAL
:数据通过 AXI4‑Stream 连接传输到加速接口。CU(或内核)代码必须严格遵循对应实参上的顺序访问模式,否则将导致硬件行为错误。例如,指针索引应按编码样式pointer[i++]
或*pointer++
按顺序递增。 -
RANDOM
:数据传输到片上存储器内,该存储器充当加速器的高速缓存。因此,CU 代码无需遵循顺序访问模式。重要: 片上存储器资源有限(例如,通常每个 BRAM 有 32 Kbit,可作为 1024 个 32 位码字来访问)。如果单个 compute 作业的有效载荷较大,使用过多片上 RAM,则可能在 Vivado 工具中导致时序收敛问题。那么可能使用ZERO_COPY
指南宏将加速器直接连接到全局存储器效果更好,如下所述。
-
-
- DATA_COPY(<port>, <port>[<Num>]);
-
用于推断全局存储器与加速器接口之间的数据移动器 IP。在每次
compute()
调用的运行时,此数据移动器 IP 都将在特定compute()
实参与SYS_PORT
或SYS_PORT_PFM
指南宏所指定的源存储器之间,或者在该特定实参与本地片上存储器之间进行往来数据复制。-
<port>
表示特定compute()
实参的名称。 -
<port>[<Num>]
用于指定阵列或指针实参引用的阵列元素数量。Num
可指定为compute()
的 C 语言常量和/或标量实参的表达式。这样即可允许加速器包含动态有效载荷大小(在运行时确定),并为用户定义的实参数据类型启用 AXI4 连接上的自动突发、数据宽度转换和填充。
重要: 将DATA_COPY
与RANDOM
访问模式搭配使用时,compute API 的原型中的对应实参必须声明为大小固定的阵列。例如:compute(int A[10], ...)
。 -
- ZERO_COPY(<port>);
-
指令 VSC 不推断数据移动器 IP。改为允许加速器为
compute()
函数的指定实参使用直接连接到指定全局存储器的 AXI4 接口。-
<port>
表示特定compute()
实参的名称。
-
- ASSIGN_SLR(<PE>, <SLR-IDS>);
-
VSC 将请求 Vivado 把指定 PE 的相关逻辑布局到一个或多个指定 SLR 内。但这只是一个请求,最终在布局期间做决定。
-
<PE>
:指定处理元素的名称。提示: 如果指定compute()
函数,那么 SLR 分配适用于compute()
函数内的所有 PE。 -
<SLR-IDS>
:指定用于布局 PE 的 SLR。可使用以下任一形式来指定。-
<SLR-ID>
:将指定 SLR-ID 应用于此 PE 的所有 CU 实例。 -
(
<CU1-SLR-ID> : ... : <NCU-SLR-ID>
):SLR-ID 列表,ID 间以冒号分隔,列表以括号括起。这些 SLR-ID 分配给 CU 实例。条目数必须与 (/*NCU=*/4
) 类中指定的 CU 数量相匹配。
-
-
- FREE_RUNNING(<PE>);
-
支持将指定 PE 函数标记为在硬件中自由运行或者始终执行的内核。如需了解更多信息,请参阅 加速器系统组合。