将 RTL 代码封装为 Vitis XO - 2022.1 简体中文

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

Document ID
UG1393
Release Date
2022-05-25
Version
2022.1 简体中文
重要: 应首先按传统 RTL 验证方法对 RTL IP 进行完整验证,然后才能将其封装为内核。

内核接口要求 中所述,RTL 内核必须随以下必要接口一起封装:

  • AXI4-Lite 接口名称必须作为 S_AXI_CONTROL 封装,但是下面的 AXI 端口可以用不同的方式命名。
  • 任意 AXI4 存储器映射接口都必须封装为 AXI4 主端点(支持 64 位地址)。
  • 您还可实现 AXI4-Stream 接口。
  • 内核需要至少 1 个时钟,但它可支持多个时钟。
    • 每个时钟都必须具有 1 个关联的总线接口用于将其识别为时钟。
    • 每个时钟都能有 1 个可选低电平有效复位,由时钟上的 ASSOCIATED_RESET 属性来指定。
    • 每个时钟都必须与内核上的每个 AXI4-LiteAXI4AXI4-Stream 接口关联。

要封装 IP,请使用以下步骤:

  1. 创建和封装新 IP。
    1. Vivado 工程中,添加 RTL 源文件,然后选择Tools > Create and Package New IP(工具 > 创建并封装新 IP)。
    2. 选择Package your current project(封装当前工程),然后单击Next(下一步)。
    3. 指定已封装的 IP 的位置。您可选择默认位置,也可以选择其它位置。
    4. 复查Summary(汇总)页面,然后单击Finish(完成)以打开Package IP(封装 IP)窗口。

    这样会打开Package IP(封装 IP)窗口,并显示Identification(标识)页面。如需获取有关在 Vivado 工具中使用 IP 封装器的详细信息,请参阅 Vivado Design Suite 用户指南:创建和封装定制 IP(UG1118)

  2. 选择Packaging Steps(封装步骤)下的Compatibility(兼容性)。这样会显示Compatibility视图,如下图所示。

    1. 勾选Package for Vitis(适用于 Vitis 的封装)复选框以启用 RTL IP 封装进程,将其封装为 XO 以供在 Vitis 环境内使用。
    2. 单击 RTL 内核的Control Protocol(控制协议)。这样即可确定用于操作内核的控制机制。选项包括:
      • user_managed:定义软件可控制的内核,即由用户管理而非由 XRT 管理。这是首选的选项。如需了解更多信息,请参阅 创建用户管理的 RTL 内核
      • ap_ctrl_hs:这是默认选项,为 XRT 管理的内核指定简单的顺序执行模型,如 软件可控内核 中所述。
      • ap_ctrl_chain:为 XRT 管理的内核指定流水打拍执行模型。
      • ap_ctrl_none:表示无控制协议,如 非软件控制的内核 中所述。
    3. 检查确保Package for IPI(适用于 IPI 的封装)和Ignore Freq_Hz(忽略 Freq_Hz)也已一并启用。

    启用这些复选框即可启用设计规则检查 (DRC),ipx::check_integrity 命令会在封装 IP 和生成 XO 之前运行这些检查。这些 DRC 包括按 RTL 内核的要求 中所述方式检查所需的信号,并检查 XRT 管理的内核的控制协议和寄存器。如上图所示,遇到的任何问题都会向Package IP(封装 IP)工具报告。

  3. 将时钟关联到 AXI 接口。

    选择Package IP窗口的Ports and Interfaces(端口和接口)步骤,您可将基准内核时钟与 AXI4 接口相关联,并按需复位信号。

    1. 右键单击 AXI4 接口,并选择Associate Clocks(关联时钟)。

      这样即可打开Associate Clocks对话框,其中列出了所有已识别的时钟信号。

    2. 选中相应的时钟,然后单击OK以将其与接口关联。
    3. 请务必对含每个 AXI 接口的时钟信号重复此步骤。
  4. 单击Addressing and Memory(寻址和存储器)步骤即可添加控制寄存器和偏移。

    使用 ap_ctrl_hsap_ctrl_chain 控制协议的 XRT 管理的内核需要控制寄存器,如 XRT 管理的内核的控制要求 中所述。下表显示了所需寄存器的列表。

    提示: 虽然 ap_ctrl_noneuser_managed 控制协议无需控制寄存器,但如果在 RTL 设计中包含 s_axilite 接口,那么这两者仍可使用控制寄存器。在此情况下,具体寄存器可能不同于下表中所述,但 namesoffsetswidths 的赋值进程是相同的。
    表 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_axiaxis 接口位宽则为 64 位。

    1. 要创建该表中所述的地址映射,请在Address Blocks(地址块)中右键单击并选择Add Register(添加寄存器)命令。

      这样即可打开Add Register视图,您可在其中输入上表中的某一寄存器名称。

    2. 按需重复此步骤,以添加所有必需的寄存器。
      这样即可在Addressing and Memory部分中创建Registers表。您可编辑该表以向每个寄存器添加Description(描述)、Address Offset(地址偏移)和Size(大小)。Registers表应如以下示例所示。

      提示: 此进程中每个步骤的对应 Tcl 命令都将写入 Tcl 控制台。您可据此执行整个进程,然后使用 Tcl 转录内容来创建脚本,以供为将来迭代自动执行整个进程。
    3. 最后,选中表中每个指针实参的寄存器、右键单击并选择Add Register Parameter(添加寄存器参数)命令。在打开的对话框中输入 ASSOCIATED_BUSIF 名称,然后单击OK

      这样即可定义寄存器与 AXI4 接口之间的关联。在添加的参数的值字段中,输入分配给您正在定义的特定实参的 m_axi 接口的名称。在以上示例中,实参 A 使用的是 m00_axi 接口,而实参 B 使用的则是 m01_axi 接口。

  5. 此时,您已准备就绪,可以进行 IP 封装了。
    1. 选中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 存档)设置。
    2. 准备就绪后,即可单击Package IP(封装 IP)。

      Vivado 工具会封装您的内核 IP、按需自动运行 package_xo 命令以生成 XO 文件,并打开对话框以通知您操作成功。

      为 RTL 内核生成的 XO 文件可供 Vitis 编译器在链接进程中用于连接至其它 HLS 或 RTL 内核,以及用于链接目标平台以完成整个系统。如需了解更多信息,请参阅 构建和运行应用

    3. 如果您的 RTL 内核包含某些定制功能,且对于自动运行的 package_xo 命令而言这些属于非标准功能,那么您可使用定制设置来手动运行此命令以重新生成 XO 文件和内核。请参阅 package_xo 命令 以获取该命令的详细信息。需手动运行 package_xo 命令的可能原因包括:
      • 指定不同的 IP 目录或 XO 路径。
      • 输出 kernel.xml 文件副本以供稍后进行编辑和复用。
      • 使用 package_xo -kernel_files 选项包含 C 语言模型,以便支持对 RTL 内核进行软件仿真,如 将 C 语言模型添加到 RTL 内核 中所述。
  6. 可选:测试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 设置为只读或只写。

  7. 可选:配置设计约束。

    如果 RTL 内核具有设计约束 (.xdc),并且此约束引用平台的静态区域的元素(例如,时钟),那么需将此约束文件标记为late processing order(后续处理顺序)以确保正确应用 RTL 内核约束。

    有两种方法可标记约束以供后续处理:

    1. 如果在 .ttcl 文件中提供约束,请将 <: setFileProcessingOrder "late" :> 添加到此文件的 .ttcl 前导码部分,如下所示:
      <: set ComponentName [getComponentNameString] :>
      <: setOutputDirectory "./" :>
      <: setFileName $ComponentName :>
      <: setFileExtension ".xdc" :>
      <: setFileProcessingOrder "late" :>
      
    2. 如果在 .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>