如 内核接口要求 中所述,RTL 内核必须随以下必要接口一起封装:
-
AXI4-Lite 接口名称必须作为
S_AXI_CONTROL
封装,但是下面的 AXI 端口可以用不同的方式命名。 - 任意 AXI4 存储器映射接口都必须封装为 AXI4 主端点(支持 64 位地址)。建议: 赛灵思强烈推荐 AXI4 接口与 AXI 元数据
HAS_BURST=0
和SUPPORTS_NARROW_BURST=0
一起封装。这些属性可以在 IP 级 bd.tcl 文件中设置。这表明并未使用卷绕和固定突发类型,也未使用窄(小型)突发。 - 您还可实现 AXI4-Stream 接口。
- 内核需要至少 1 个时钟,但它可支持多个时钟。
- 每个时钟都必须具有 1 个关联的总线接口用于将其识别为时钟。
- 每个时钟都能有 1 个可选低电平有效复位,由时钟上的 ASSOCIATED_RESET 属性来指定。
- 每个时钟都必须与内核上的每个 AXI4-Lite、AXI4 和 AXI4-Stream 接口关联。
要封装 IP,请使用以下步骤:
- 创建和封装新 IP。
- 在 Vivado 工程中,添加 RTL 源文件,然后选择 (工具 > 创建并封装新 IP)。
- 选择Package your current project(封装当前工程),然后单击Next(下一步)。
- 指定已封装的 IP 的位置。您可选择默认位置,也可以选择其它位置。
- 复查Summary(汇总)页面,然后单击Finish(完成)以打开Package IP(封装 IP)窗口。
这样会打开Package IP(封装 IP)窗口,并显示Identification(标识)页面。如需获取有关在 Vivado 工具中使用 IP 封装器的详细信息,请参阅 Vivado Design Suite 用户指南:创建和封装定制 IP(UG1118)。
- 选择Packaging Steps(封装步骤)下的Compatibility(兼容性)。这样会显示Compatibility视图,如下图所示。
- 勾选Package for Vitis(适用于 Vitis 的封装)复选框以启用 RTL IP 封装进程,将其封装为 XO 以供在 Vitis 环境内使用。
- 单击 RTL 内核的Control Protocol(控制协议)。这样即可确定用于操作内核的控制机制。选项包括:
-
user_managed
:定义软件可控制的内核,即由用户管理而非由 XRT 管理。这是首选的选项。如需了解更多信息,请参阅 创建用户管理的 RTL 内核。 -
ap_ctrl_hs
:这是默认选项,为 XRT 管理的内核指定简单的顺序执行模型,如 软件可控内核 中所述。 -
ap_ctrl_chain
:为 XRT 管理的内核指定流水打拍执行模型。 -
ap_ctrl_none
:表示无控制协议,如 非软件控制的内核 中所述。
-
- 检查确保Package for IPI(适用于 IPI 的封装)和Ignore Freq_Hz(忽略 Freq_Hz)也已一并启用。
启用这些复选框即可启用设计规则检查 (DRC),
ipx::check_integrity
命令会在封装 IP 和生成 XO 之前运行这些检查。这些 DRC 包括按 RTL 内核的要求 中所述方式检查所需的信号,并检查 XRT 管理的内核的控制协议和寄存器。如上图所示,遇到的任何问题都会向Package IP(封装 IP)工具报告。 - 将时钟关联到 AXI 接口。
选择Package IP窗口的Ports and Interfaces(端口和接口)步骤,您可将基准内核时钟与 AXI4 接口相关联,并按需复位信号。
- 右键单击 AXI4 接口,并选择Associate Clocks(关联时钟)。
这样即可打开Associate Clocks对话框,其中列出了所有已识别的时钟信号。
- 选中相应的时钟,然后单击OK以将其与接口关联。
- 请务必对含每个 AXI 接口的时钟信号重复此步骤。
- 右键单击 AXI4 接口,并选择Associate Clocks(关联时钟)。
- 单击Addressing and Memory(寻址和存储器)步骤即可添加控制寄存器和偏移。
使用
ap_ctrl_hs
或ap_ctrl_chain
控制协议的 XRT 管理的内核需要控制寄存器,如 XRT 管理的内核的控制要求 中所述。下表显示了所需寄存器的列表。提示: 虽然ap_ctrl_none
和user_managed
控制协议无需控制寄存器,但如果在 RTL 设计中包含s_axilite
接口,那么这两者仍可使用控制寄存器。在此情况下,具体寄存器可能不同于下表中所述,但names
、offsets
和widths
的赋值进程是相同的。表 1. 地址映射 寄存器名称 描述 地址偏移 大小 CTRL 控制信号。 重要: Ctrl 寄存器和 <kernel_args> 在所有内核上都是必需的。仅限含中断的设计才需要中断相关的寄存器。0x000 32 GIER 全局中断使能寄存器。用于启用对主机的中断。 0x004 32 IP_IER IP 中断使能寄存器。用于控制使用哪个 IP 生成的信号生成中断。 0x008 32 IP_ISR IP 中断状态寄存器。提供中断状态。 0x00C 32 <kernel_args> 针对软件函数接口上所需的每个内核实参,都包含 1 个独立条目。所有用户定义的寄存器必须从位置 0x10
开始;此位置以下的位置均为保留位置。0x010 32/64 标量实参位宽为 32 位。
m_axi
和axis
接口位宽则为 64 位。- 要创建该表中所述的地址映射,请在Address Blocks(地址块)中右键单击并选择Add Register(添加寄存器)命令。
这样即可打开Add Register视图,您可在其中输入上表中的某一寄存器名称。
- 按需重复此步骤,以添加所有必需的寄存器。这样即可在Addressing and Memory部分中创建Registers表。您可编辑该表以向每个寄存器添加Description(描述)、Address Offset(地址偏移)和Size(大小)。Registers表应如以下示例所示。
提示: 此进程中每个步骤的对应 Tcl 命令都将写入 Tcl 控制台。您可据此执行整个进程,然后使用 Tcl 转录内容来创建脚本,以供为将来迭代自动执行整个进程。 - 最后,选中表中每个指针实参的寄存器、右键单击并选择Add Register Parameter(添加寄存器参数)命令。在打开的对话框中输入
ASSOCIATED_BUSIF
名称,然后单击OK。这样即可定义寄存器与 AXI4 接口之间的关联。在添加的参数的值字段中,输入分配给您正在定义的特定实参的
m_axi
接口的名称。在以上示例中,实参A
使用的是m00_axi
接口,而实参B
使用的则是m01_axi
接口。
- 要创建该表中所述的地址映射,请在Address Blocks(地址块)中右键单击并选择Add Register(添加寄存器)命令。
- 此时,您已准备就绪,可以进行 IP 封装了。
- 选中Package IP(封装 IP)视图的Review and Package(复查和封装)部分、复查Summary”和“After Packaging这两部分,按需进行更改。重要: 您必须启用 IP 存档文件生成。如果After Packaging(封装后)部分显示An archive will not be generated.(将不生成存档),则您必须选中Edit packaging settings(编辑封装设置)链接,并启用Create archive of IP(创建 IP 存档)设置。
- 准备就绪后,即可单击Package IP(封装 IP)。
Vivado 工具会封装您的内核 IP、按需自动运行
package_xo
命令以生成 XO 文件,并打开对话框以通知您操作成功。为 RTL 内核生成的 XO 文件可供 Vitis 编译器在链接进程中用于连接至其它 HLS 或 RTL 内核,以及用于链接目标平台以完成整个系统。如需了解更多信息,请参阅 构建和运行应用。
- 如果您的 RTL 内核包含某些定制功能,且对于自动运行的
package_xo
命令而言这些属于非标准功能,那么您可使用定制设置来手动运行此命令以重新生成 XO 文件和内核。请参阅 package_xo 命令 以获取该命令的详细信息。需手动运行package_xo
命令的可能原因包括:- 指定不同的 IP 目录或 XO 路径。
- 输出 kernel.xml 文件副本以供稍后进行编辑和复用。
- 使用
package_xo -kernel_files
选项包含 C 语言模型,以便支持对 RTL 内核进行软件仿真,如 将 C 语言模型添加到 RTL 内核 中所述。
- 选中Package IP(封装 IP)视图的Review and Package(复查和封装)部分、复查Summary”和“After Packaging这两部分,按需进行更改。
- 可选:测试Packaged IP。
要测试 RTL 内核是否已正确封装以供 IP integrator 使用,请尝试将封装的内核 IP 例化到 IP integrator 中的块设计中。如需了解有关此工具的信息,请参阅 Vivado Design Suite 用户指南:采用 IP integrator 设计 IP 子系统(UG994)。
此内核 IP 应显示上述各接口。请在画布视图中检验 IP。AXI 接口属性可以通过选择画布上的接口查看。然后在Block Interface Properties(块接口属性)视图中,选中Properties(属性)选项卡,并展开CONFIG(配置)表格条目。如果接口为只读或只写,可以移除未使用的 AXI 通道,将
READ_WRITE_MODE
设置为只读或只写。 - 可选:配置设计约束。
如果 RTL 内核具有设计约束 (.xdc),并且此约束引用平台的静态区域的元素(例如,时钟),那么需将此约束文件标记为late processing order(后续处理顺序)以确保正确应用 RTL 内核约束。
有两种方法可标记约束以供后续处理:
- 如果在 .ttcl 文件中提供约束,请将
<: setFileProcessingOrder "late" :>
添加到此文件的 .ttcl 前导码部分,如下所示:<: set ComponentName [getComponentNameString] :> <: setOutputDirectory "./" :> <: setFileName $ComponentName :> <: setFileExtension ".xdc" :> <: setFileProcessingOrder "late" :>
- 如果在 .xdc 文件中定义约束,则请在 component.xml 中添加从
<spirit:define>
开始的 4 行内容。component.xml 中的这 4 行内容需位于调用 .xdc 文件的区域旁。在以下示例中,根据已定义的后续处理顺序来调用 my_ip_constraint.xdc 文件。<spirit:file> <spirit:name>ttcl/my_ip_constraint.xdc</spirit:name> <spirit:userFileType>ttcl</spirit:userFileType> <spirit:userFileType>USED_IN_implementation</spirit:userFileType> <spirit:userFileType>USED_IN_synthesis</spirit:userFileType> <spirit:define> <spirit:name>processing_order</spirit:name> <spirit:value>late</spirit:value> </spirit:define> </spirit:file>
- 如果在 .ttcl 文件中提供约束,请将