添加硬件接口 - 2022.1 简体中文

Vitis 统一软件平台文档 应用加速开发 (UG1393)

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文

下表显示了加速嵌入式平台可能的 Vitis 输入以及最低要求。

表 1. Vitis 的可用接口
输入 Vitis 可使用的类型 AXI MM 内核的最低要求
控制接口 AXI 主接口,源自 PS 或者源自 AXI Interconnect IP 或 SmartConnect IP 1 个 AXI4-Lite 主接口,用于内核控制
存储器接口 AXI 从接口 1 个存储器接口,用于数据交换
串流接口 AXI4-Stream 接口 非必需
时钟 多个时钟信号 1 个时钟
中断 多个中断信号 1 个中断

一般要求

重要: Vivado 工程的所有元素的源文件必须位于工程本地,随后才能将其作为 XSA 进行导出,否则在 Vitis 工具中使用平台时可能会返回错误。
  • 平台设计中所用不属于标准 Vivado IP 目录的每个 IP 都必须位于 Vivado Design Suite 工程本地。创建可扩展 XSA 时,不支持引用工程外部的 IP 存储库路径。
  • Vitis 编译器用于链接至内核的任意平台接口都必须为以下任一接口类型:AXI4AXI4-LiteAXI4-Stream、中断、时钟或复位类型。
  • 具有 AXI 接口(供 Vitis 编译器用于链接至内核)的任何平台 IP 都必须同时包含关联的时钟管脚,才能使 v++ 根据需要正确推断和插入时钟域交汇逻辑。
  • 不支持通过 v++ 连接器 --connectivity.sp--connectivity.sc 指令来处理平台或内核上的定制总线类型和硬件接口。如果 Vitis 编译器需要将含定制总线类型的数据总线连接到内核,则必须将其转换为 AXI4AXI4-LiteAXI4-Stream 接口。

工程类型

要为 Vivado 工程类型创建新的 XSA 平台,请选中RTL Project(RTL 工程)并启用Project is an extensible Vitis platform(工程为可扩展 Vitis 平台)复选框。

图 1. 工程类型
提示:New ProjectWizard(新建工程向导)中,您将看到这些设置。

创建新工程时,选中Project is an extensible Vitis platform

要将现有 Vivado 工程更改为可扩展 Vitis 平台工程,请选中Project Manager > Settings in the Flow Navigator(工程管理器 > Flow Navigator 中的设置),并启用Project is an extensible Vitis platform

set_property platform.extensible true [current_project]

添加平台接口

如果块设计中的组件具有 PFM 属性,那么该组件可通过 v++ 连接器来识别,并且可供加速内核使用。

Vivado IDE 中,平台接口 (PFM) 属性可在Platform Setup(平台设置)窗口中进行设置,前提是将该工程作为可扩展的平台工程来创建。单击Window menu > Platform Setup(窗口菜单 > 平台设置)即可打开设置。

图 2. 平台设置
提示: 平台设置可在 Tcl 控制台中手动定义,或者也可通过 Tcl 脚本来定义。

4 大平台接口 Tcl API:

  • AXI 存储器映射接口:
    set_property PFM.AXI_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • AXI4-Stream 接口:
    set_property PFM.AXIS_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • 时钟与复位:
    set_property PFM.CLOCK { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]
  • 中断:
    set_property PFM.IRQ {pin_name {id id_number range irq_count}} [get_bd_cells <cell_name>]

PFM 属性的要求包括:

  • PFM 接口属性的值必须指定为 Tcl 词典,即:名称/"值" 对组成的列表。
    重要: "值" 必须加引号,并且名称和值均为区分大小写。
  • bd_cell 可具有多个 PFM 接口定义。但对于每种类型的 PFM 接口,必须通过一条 set_property Tcl 命令来设置所有端口。
  • 对于每个 PFM 接口属性,针对端口对象指定的名称必须与 bd_cell 上的外部端口或接口名称相匹配。每个外部端口或接口对象都只能有一个 PFM 接口定义。
  • 每种不同类型的 PFM 接口都可具有不同的参数。
  • 以 NULL ("") 字符串来设置 PFM 属性将导致删除先前定义的 PFM 接口。

添加 AXI 接口

为支持 AXI 存储器映射内核,平台需随 AXI 存储器映射主端口 (M_AXI) 声明至少 1 个 AXI 控制接口,并随 AXI 从端口 (S_AXI) 声明至少 1 个存储器接口。这些接口可从 PS 块直接导出或者连接 Interconnect IP。如果此平台不使用 AXI 存储器映射内核,则不需要这些接口。

以下是 Tcl 命令语法:

set_property PFM.AXI_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]

AXI 控制接口与 AXI 存储器接口共享同一个 PFM.AXI 属性。但其 memport 类型不同。

Memport
AXI 控制接口可定义为 M_AXI_GP。存储器接口则使用其它类型:S_AXI_HP、S_AXI_ACP、S_AXI_HPC 或 MIG。
SP Tag ID
(可选)用户定义的 ID,应以字母字符开头。ID 区分大小写。系统端口标签 (sptag) 属于符号标识,表示平台端口连接的类,例如,S_AXI_HP、S_AXI_ACP 等。多个块设计平台端口可共享同一个 sptag。如需了解有关如何使用 sptags 的更多信息,请参阅 将内核端口映射到存储器
提示: M_AXI_GP 端口不支持 sptag 属性。
存储器
(可选)指定关联的 MIG IP 实例和 address_segment。memory 标签属于唯一标识,用于将 IP integrator 的“Address Editor”(地址编辑器)中的“Cell Name”(单元名称)列和“Base Name”(基本名称)列组合在一起。此标签将与 Memory Subsystem HIP 连接相关联,在其中,多个块设计平台端口可共享相同的 memory 标签。

导出 AXI Interconnect 主端口和从端口包含下列要求:

  • 平台内使用的互连上的所有端口按索引顺序都必须位于任意已声明的平台接口之前。
  • 端口索引之间可不含间隙。
  • S_AXI_ACP 端口的主 ID 最大数量为 8,因此在已连接的 AXI Interconnect 上,要声明的可用端口必须为 {S00_AXI, S01_AXI, ..., S07_AXI} 之一。请勿声明平台本身内部使用的任何端口。尽可能声明更多端口将能够使 sds++ 避免级联 axi_interconnects
  • S_AXI_HP 或 MIG 端口的主 ID 最大数量为 16,因此在已连接的 AXI Interconnect 上,要声明的可用端口必须为 {S00_AXI, S01_AXI, ..., S15_AXI} 之一。请勿声明平台本身内部使用的任何端口。尽可能声明更多端口将能够使 v++ 避免在生成的用户系统中出现级联 axi_interconnects
  • 在已连接到 M_AXI_GP 端口的互连上声明的主端口的最大数量为 64,因此在已连接的 AXI Interconnect 上,要声明的可用端口必须为 {M00_AXI, M01_AXI, ..., M63_AXI} 之一。请勿声明平台本身内部使用的任何端口。尽可能声明更多端口将能够使 v++ 避免在生成的用户系统中出现级联 axi_interconnects

以下显示了在 AXI Interconnect IP 上定义 AXI 主端口的示例:

set parVal []
for {set i 2} {$i < 64} {incr i} {
lappend parVal M[format %02d $i]_AXI \
{memport "M_AXI_GP"}
}
set_property PFM.AXI_PORT $parVal [get_bd_cells /axi_interconnect_0]

以下显示了在 SmartConnect IP 上定义含 MIG 的 AXI 存储器端口的示例:

set parVal []
for {set i 1} {$i < 16} {incr i} {
lappend parVal S[format %02d $i]_AXI 
{memport "MIG" sptag "Bank0"}
}
set_property PFM.AXI_PORT $parVal [get_bd_cells /smartconnect_0]

以下提供了控制接口和存储器接口的 PFM.AXI_PORT 设置示例。

set_property PFM.AXI_PORT {
M_AXI_HPM1_FPD {memport "M_AXI_GP"} 
S_AXI_HPC0_FPD {memport "S_AXI_HPC" sptag "HPC0" memory "zynq_ultra_ps_e_0 HPC0_DDR_LOW"}  
S_AXI_HPC1_FPD {memport "S_AXI_HPC" sptag "HPC1" memory "zynq_ultra_ps_e_0 HPC1_DDR_LOW"}  
S_AXI_HP0_FPD {memport "S_AXI_HP" sptag "HP0" memory "zynq_ultra_ps_e_0 HP0_DDR_LOW"}  
S_AXI_HP1_FPD {memport "S_AXI_HP" sptag "HP1" memory "zynq_ultra_ps_e_0 HP1_DDR_LOW"}  
S_AXI_HP2_FPD {memport "S_AXI_HP" sptag "HP2" memory "zynq_ultra_ps_e_0 HP2_DDR_LOW"}
} [get_bd_cells /ps_e]
提示: 在以上示例中,zynq_ultra_ps_e_0Zynq UltraScale+ MPSoC 模块的实例名称,HPC0_DDR_LOW 是地址范围名称。

添加 AXI4-Stream 接口

为支持 AXI4-Stream 串流内核,平台需声明对应的 AXI4-Stream 主接口或从接口。

AXI4-Stream 内核接口是使用 PFM.AXIS_PORT sptag 接口属性和与 v++ 连接器匹配的 connectivity.sc 命令实参指定的。

以下是 Tcl 命令语法:

set_property PFM.AXIS_PORT { <port_name> {parameters} <port2> {parameters} ...} [get_bd_cells <cell_name>]

实参描述

port_name
AXI4-Stream 端口名称。
parameters
类型值:串流接口端口类型。有效的类型值包括:
  • M_AXIS:通用 AXI 主端口
  • S_AXIS:高性能 AXI 从端口

示例

set_property PFM.AXIS_PORT {AXIS_P0 {type "S_AXIS"}} [get_bd_cells /zynq_ultra_ps_e_0]
注释: 如需了解有关在内核与平台之间链接 AXI4-Stream 接口的更多信息,请参阅 在计算单元之间指定串流连接

添加时钟和复位

图 3. 平台设置 - 时钟

您可随平台导出任意时钟源,但对于每个时钟,您还必须使用平台中的 Processor System Reset IP 块来导出已同步的复位信号。如需了解有关定义时钟和复位的详细信息,请参阅 Vitis-Tutorials/Vitis_Platform_Creation。PFM.CLOCK 属性可在 BD 单元、外部端口或外部接口上进行设置。

在上图中,您可以看到平台时钟的详细信息。平台必须启用至少一个时钟,并将其指定为默认时钟。

以下是用于设置 PFM.CLOCK 属性的 Tcl 命令:

set_property PFM.CLOCK { <port_name> {parameters} \
<port2> {parameters} ...} [get_bd_cells <cell_name>]

添加中断

Vitis 提供了一种方法,可在 v++ 链接阶段将内核输出 IRQ 信号自动连接到平台中的 IRQ。以下显示了此 Tcl 命令的语法:

set_property PFM.IRQ {pin_name {id id_number}} bd_cell
set_property PFM.IRQ {port_name {id id_number range irq_count}} [get_bd_cell <cell_name>]

实参描述

Port_name
bd_cell 的 IRQ 端口名称。
id_number
范围介于 0 到 127 之间的整数,用于指定 IRQ 编号和起始编号(如果已指定范围)。
irq_count
用于标记接口,否则这些接口可能用于参数传输以指定总线大小(例如,中断控制器 intr 接口)。

此示例显示了如何对 axi_intc_0 intr 端口启用 32 个 IRQ 输入。

set_property PFM.IRQ {intr {id 0 range 32}} [get_bd_cells /axi_intc_0]

此示例显示了如何在 VCK190 基本平台中启用 63 个含级联中断控制器的 IRQ。

set_property PFM.IRQ {intr {id 0 range 32}}  [get_bd_cells /axi_intc_cascaded_1]
set_property PFM.IRQ {In0 {id 32} In1 {id 33} In2 {id 34} In3 {id 35} In4 {id 36} In5 {id 37} In6 {id 38} In7 {id 39} In8 {id 40} \
                               In9 {id 41} In10 {id 42} In11 {id 43} In12 {id 44} In13 {id 45} In14 {id 46} In15 {id 47} In16 {id 48} In17 {id 49} In18 {id 50} \
                               In19 {id 51} In20 {id 52} In21 {id 53} In22 {id 54} In23 {id 55} In24 {id 56} In25 {id 57} In26 {id 58} In27 {id 59} In28 {id 60} \
                               In29 {id 61} In30 {id 62}} [get_bd_cells /xlconcat_0]

导出可扩展平台

硬件平台以 XSA 文件格式进行封装。有 2 种类型的 XSA 格式:用于嵌入式软件开发的固定 XSA 和用于 Vitis 应用加速工程的可扩展 XSA。要为 Vitis 应用加速流程创建嵌入式平台,必须使用可扩展 XSA。

Vivado 工程类型设置为extensible Vitis platform(可扩展 Vitis 平台)时,可通过File > Export > Export Platform(文件 > 导出 > 导出平台)菜单命令启动Export PlatformWizard(导出平台向导)。

重要: 块设计必须包含 HDL 封装文件,并生成输出目标以导出平台 XSA。Create HDL Wrapper(创建 HDL 封装文件)可通过如下两种方式来使用:在Sources(源文件)窗口中通过右键单击菜单来使用,也可以通过 Vivado IDE 的Flow Navigator中的Generate Block Design(生成块设计)来使用。
图 4. 导出硬件平台向导

“Export Platform”Wizard(导出平台向导)包含 5 个页面,旨在帮助您导出可扩展平台 XSA:

Platform Type
此“平台类型”页面用于指定 XSA 以支持硬件仿真和硬件目标。
Platform State
此“平台状态”页面用于指定 XSA 以包含平台实现或者仅包含综合。
Platform Properties
此“平台属性”页面用于定义平台属性,并允许您指定 Tcl 脚本和 XDC 约束,供 Vitis 编译器在构建系统时使用。
Output File
此“输出文件”页面用于指定输出文件名和位置。
Summary
此“汇总”页面用于报告将在导出期间使用的各项设置。

Export Hardware PlatformWizard(导出硬件平台向导)中,请选择平台类型。有 3 种类型的平台:仅用于在硬件上运行的平台,仅用于硬件仿真的平台或者既可在硬件仿真中运行也可在硬件上运行的平台。这些选项之间的差异在于:如果仿真不支持某些模块,那么您应创建独立的仿真专用设计、将其导出为“硬件仿真”平台,然后使用“Combine XSAs”(组合 XSA)选项来将硬件 XSA 与硬件仿真 XSA 组合为能够同时执行这两项作业的单一 XSA。

对于基础平台,请使用以下步骤:

  1. 选择Hardware and Hardware Emulation(硬件和硬件仿真)。单击Next(下一步)。
  2. 选择Pre-synthesis for Platform State(平台状态预综合)。仅当创建 DFX 平台时才需要执行实现后操作。单击Next(下一步)。
  3. 输入Platform Properties(平台属性)。单击Next(下一步)。
  4. 输入 XSA 文件名,然后导出目标目录。单击Next(下一步)。
  5. 检查汇总信息,然后单击Finish(完成)。

您还可在命令行中使用以下命令来执行此操作:

set_property pfm_name {vendor:board:name:version} [get_files <bd_file>]
write_hw_platform -hw -force <XSA file>

要创建硬件 XSA 与硬件仿真 XSA 并将两者组合,请使用以下命令:

write_hw_platform -hw <hw_platform> 
write_hw_platform -hw_emu <hw_emu_platform>
combine_hw_platform -hw <hw_platform> -hw_emu <hw_emu_platform> -o <combined_platform>