4 修改

4.1 与自定义逻辑集成

Xillybus demo bundle 的设计便于与应用逻辑集成。连接数据的位置是 xillydemo.v 或 xillydemo.vhd 文件(取决于首选语言)。为了使用 Xillybus IP 核在主机(Linux 或 Windows)与 FPGA 之间传输数据,可以忽略 bundle 中所有其他 HDL 文件。

可以将包含自定义逻辑设计的其他 HDL 文件添加到按照第 3.53.3 段描述准备的项 目中,然后重新点击“Generate Programming File”或“Generate Bitstream”进行构建。无需重复初始部署的其他步骤,因此逻辑的开发周期相 当快速且简单。

当将 Xillybus IP 核连接到自定义应用逻辑时,强烈建议仅通过 FIFO 与 Xillybus IP 核交互,至少在第一阶段不要尝试用逻辑 模拟 FIFO 的行为。

一个例外是将存储器或寄存器阵列连接到 Xillybus 时,此时应遵循 xillydemo 模块中所示的示例。

在 xillydemo 模块中,FIFO 用于执行数据回环。换句话说,从主机接收到的数据被发送回主机。FIFO 的两端都连接到 Xillybus IP 核,因此该核既是数据源也是数据接收端。

在实际使用场景中,FIFO 只有一端连接到 Xillybus IP 核。FIFO 的另一端连接到应用逻辑,由其提供或消费数据。

xillydemo 模块中使用的 FIFO 两端共用一个时钟,因为两侧都由 Xillybus 的主时钟驱动。在实际应用中,可能需要将其替换为读写时钟 分离的 FIFO。这样可以将数据源和数据消费端用不同于 bus_clk 的时钟驱动。通过这种方式,FIFO 不仅起到中介作用,还用于正确的时钟 域交叉。

请注意,对于从 FPGA 到主机的流,Xillybus IP 核期望的是 普通 FIFO 接口(而非 First Word Fall Through,FWFT)。

以下文档与集成自定义逻辑相关:

4.2 包含到自定义项目中

如果需要,可以将 Xillybus IP 核包含到现有的 Vivado / ISE 项目中,或者从头创建新项目。

如果项目尚未存在,则开始一个新项目,并根据首选 HDL 语言和目标 FPGA 进行设置。

要将 Xillybus IP 核包含到 Vivado 项目中,建议编辑 xillydemo-vivado.tcl 以反映自定义项目的源文件和设置,然后运行此脚 本创建新项目。

要将 Xillybus IP 核包含到 ISE 项目中:

  • 当使用 Virtex-5/6 或 series-7 系列的 FPGA 时,需要单独生成 PCIe 包装器文件,详见第 3.4 段(对于 Virtex-5 FPGA,还需参见第 4.3.5 段)。生成的 Verilog 文 件应添加到自定义项目中(但不要添加 XCO 文件)。

  • 将两个 src/ 子目录之一的全部文件(根据语言偏好)添加到项目中。

  • 在宏搜索路径中添加一个目录:在过程菜单中,选择“Implementation”下的 “Translate”,右键单击并选择“Process Properties...”。将 ’core’ 子目录添加到 Macro Search Path 属性中(使用最右侧的按钮浏览)。如果未设置此属性,则在实施过程中的 Translate 阶段会失败,因为找不到 xillybus_core.ngc 文件。

  • 如果 xillydemo 模块不是项目的顶层模块,请将其端口连接到顶层。

  • 要将 Xillybus IP 核连接到自定义应用逻辑,请编辑 xillydemo 模块,将现有的应用逻辑替换为所需逻辑。

4.3 使用其他板卡

4.3.1 通用

当使用未出现在 demo bundle 列表中的板卡时,需要对 bundle 进行一些细微修改。

该核会生成几个 GPIO LED 输出。如果板上有空闲的 LED,建议将其连接到这些 LED。

4.3.2 使用 Xillybus for PCIe

大多数购买的板卡都有自己的 FPGA 设计示例,展示了如何在该板卡上使用 PCIe 接口。通常最简单的做法是在目标板卡的 XDC / UCF 文件中找到相关的引脚分配,然后将引脚名称修改为 Xillybus 的 XDC / UCF 文件中使用的名称。然后可以替换 Xillybus 项目所使 用的 XDC / UCF 文件中的相关行。

关于如何放置引脚的详细信息如下所示。

请注意,最常见的错误与 PCIe 总线的参考时钟有关。连接任何频率相同的时钟都是行不通的:主板时钟与其他时钟之间的 微小频率差异将使收发器偶尔失去锁定,导致通信不可靠,甚至可能无法将 FPGA 检测为 PCIe 设备。

由于 Xillybus 核基于 AMD 的 PCIe 核,因此 AMD 的用户指南是与 PCIe 物理层相关的有效参考来源。

4.3.3 使用 Spartan-6 PCIe 板卡

对于 Spartan-6,Xillybus 核通过 PCIe 总线端口与主机连接,该端口由以下 7 根物理线组成:

  • 一对差分线用于参考时钟,名称为 PCIE_250M_P 和 PCIE_250M_N:这些线上应提供频率为 125 MHz(尽管网络名称如 此,但源自 PCIe 总线时钟)的时钟。如果使用不同的时钟,则必须重新配置 AMD PCIe Coregen 核(由 bundle 中的 pcie.xco 定义)以适配 实际时钟频率。此外,必须更新时序约束,以使 TS_PCIE_CLK 规范反映这一变化。

  • 主机的总线主复位信号 PCIE_PERST_B_LS

  • 串行数据输入差分对,PCIE_RX0_P 和 PCIE_RX0_N

  • 串行数据输出差分对,PCIE_TX0_P 和 PCIE_TX0_N

这些引脚的分配根据板卡的布线设置。

4.3.4 使用 Virtex-6 PCIe 板卡

对于 Virtex-6,布线类似:

  • 一对差分线用于参考时钟,名称为 PCIE_REFCLK_P 和 PCIE_REFCLK_N:这些线上应提供频率为 250 MHz(源自 PCIe 总线时钟)的时钟。如果使用不同的时钟,则必须重新配置 AMD PCIe Coregen 核(由 bundle 中的 pcie_v6_4x.xco 定义)以适配实际时钟 频率。此类更改可能还涉及约束的修改。请参考 Coregen 生成的示例 UCF 文件。

  • 主机的总线主复位信号 PCIE_PERST_B_LS

  • 串行数据输入差分对向量,PCIE_RX_P 和 PCIE_RX_N(各 4 对线)

  • 串行数据输出差分对向量,PCIE_TX_P 和 PCIE_TX_N(各 4 对线)

引脚分配通过放置收发器逻辑隐式完成。UCF 文件中用于定义 GTX 放置的约束强制执行特定的引脚输出。同样,参考时钟 引脚的放置通过约束时钟缓冲器(pcieclk_ibuf)的位置隐式设置。Xillybus bundle 中的 UCF 文件包含指导性注释。

必须编辑 UCF 文件,使这些引脚的放置与目标板卡匹配。

4.3.5 使用 Virtex-5 PCIe 板卡

Virtex-5 系列中有两组器件,每组需要的 PCIe 接口略有不同。为简化处理,’blockplus’ 子目录中有两个不同的 XCO 文件,只需使用其中 一个。

因此,在构建 PCIe 核之前,需要按如下方式重命名该子目录中的文件:

  • 对于 Virtex-5 LX 或 Virtex-5 SX:将 pcie_v5_gtp.xco 重命名为 pcie_v5.xco

  • 对于 Virtex-5 FX 或 Virtex-5 TX:将 pcie_v5_gtx.xco 重命名为 pcie_v5.xco

重要 的:
PCIe Block Plus 生成器的版本应为 1.14,绝对不能使用 1.15。ISE 13.1 包含适用于此的正确版本,但 ISE 13.2 附带的版本会产生有缺 陷的代码。

如果希望整体实施使用 ISE 13.1 以外的版本,可以用正确版本的 PCIe Block Plus(包含在 ISE 13.1 中)生成 Verilog 文 件,然后可以在首选 ISE 版本中完成整个项目的实施。

UCF 文件包含关于如何设置引脚的指导性注释。PCIe 引脚的放置是隐式的,由对 GTP/GTX 组件位置的约束强制执行。

PCIE_REFCLK 线对上应提供频率为 100 MHz 的时钟。如果使用不同的时钟,则必须重新配置 AMD PCIe Coregen 核(由 pcie_v5.xco 定义)以适配实际时钟频率。此外,必须更新时序约束,以使 TS_MGTCLK 规范反映这一变化。

4.3.6 使用 Kintex-7、Virtex-7 和 Artix-7 板 卡(PCIe)

所有 series-7 系列的 FPGA 具有相同的 PCIe 接口。

  • 一对差分线用于参考时钟,名称为 PCIE_REFCLK_P 和 PCIE_REFCLK_N:这些线上应提供频率为 100 MHz(源自 PCIe 总线时钟或直接连接)的时钟。

    如果使用不同的时钟,则必须重新配置 PCIe 模块(由 demo bundle 中的 pcie_k7_vivado.xci 或类似文件定义)以适配实际 时钟频率。该文件出现在项目的源文件列表中。此类更改可能还涉及时序约束的修改。请参考 AMD 工具生成的示例 XCF 文件。

    如果使用 ISE,AMD PCIe 核由例如 pcie_k7_8x.xco 定义。可能需要调整 UCF 文件而非 XDC。

  • 主机的总线主复位信号 PCIE_PERST_B_LS

  • 串行数据输入差分对向量,PCIE_RX_P 和 PCIE_RX_N(各 8 或 4 对线)

  • 串行数据输出差分对向量,PCIE_TX_P 和 PCIE_TX_N(各 8 或 4 对线)

引脚分配通过放置收发器逻辑隐式完成。UCF / XDC 文件中用于定义 GTX 放置的约束强制执行特定的引脚输出。同样,参 考时钟引脚的放置通过约束时钟缓冲器(pcieclk_ibuf)的位置隐式设置。Xillybus demo bundle 中的 UCF / XDC 文件包含指导性注释。

必须编辑 UCF / XDC 文件,使这些引脚的放置与目标板卡匹配。

4.3.7 使用 Ultrascale 和 Ultrascale+ 板卡 (PCIe)

所有这些 FPGA 具有相同的 PCIe 接口。

  • 一对差分线用于参考时钟,名称为 PCIE_REFCLK_P 和 PCIE_REFCLK_N:频率为 100 MHz 的时钟,直接连接到 PCIe 总 线的时钟。

    如果使用不同的时钟,则必须重新配置 PCIe 模块(由 demo bundle 中的 pcie_ku_vivado.xci 或类似文件定义)以适配实际 时钟频率,并且必须在 xillydemo.xdc 中更新此时钟的时序约束。这些文件出现在项目的源文件列表中。

  • 主机的总线主复位信号 PCIE_PERST_B_LS

  • 串行数据输入差分对向量,PCIE_RX_P 和 PCIE_RX_N(各 8 或 4 对线)

  • 串行数据输出差分对向量,PCIE_TX_P 和 PCIE_TX_N(各 8 或 4 对线)

引脚分配通过放置收发器逻辑隐式完成。XDC 文件中用于定义 GTX 放置的约束强制执行特定的引脚输出。同样,参考时钟 引脚的放置通过约束时钟缓冲器(pcieclk_ibuf)的位置隐式设置。Xillybus demo bundle 中的 XDC 文件包含指导性注释。

必须编辑 XDC 文件,使这些引脚的放置与目标板卡匹配。

4.3.8 使用 Versal ACAP 板卡 (PCIe)

这些 FPGA 具有以下 PCIe 接口:

  • 一对差分线用于参考时钟,名称为 PCIE_REFCLK_P 和 PCIE_REFCLK_N:频率为 100 MHz 的时钟,直接连接到 PCIe 总 线的时钟。

    如果使用不同的时钟,则必须重新配置 CPM 模块中的 PCIe 控制器(该控制器位于 pcie_versal 块设计中的 CIPS IP 内部) 以适配实际时钟频率。

  • 串行数据输入差分对向量,PCIE_RX_P 和 PCIE_RX_N(各 8 对线)

  • 串行数据输出差分对向量,PCIE_TX_P 和 PCIE_TX_N(各 8 对线)

主机的总线主复位信号直接连接到 PMC MIO 38。如果为此信号使用其他 MIO 引脚,则必须相应配置 CIPS IP(更多信息请 参见 Xillybus 的 教程页面)。

XDC 不包含与 PCIe 模块相关的任何约束。时序约束和引脚放置约束均由 CIPS IP 隐式提供。请注意,引脚放置无法移动,因为 PCIe 接 口使用 CPM。

更改 PCIe 模块参数的过程与其他 FPGA 不同:PCIe 部分作为块设计实现。在此块设计中,有一个名为 pcie_block_support 的模块。该模块包含 PCIe 模块使用的收发器和时钟资源。因此,在更改通道数或链路速度后,需要更新 pcie_block_support。仅更新 pcie_block 是不够的。

更新 pcie_block_support 的方法是删除此模块并让 Vivado 重新生成它。这样,模块将使用 PCIe 模块的更新参数创 建。

建议在开始此过程之前创建块设计的视觉副本。这将会很有帮助,因为需要用更新后的 pcie_block_support 模块重建相同的 块设计。

此过程的步骤如下:

  • 删除 pcie_block_support 模块及其所有外部端口。 这意味着删除未连接任何内容的端口(例如“pcie_mgt”), 也删除连接到某个模块的端口(例如“m_axis_cq_0”)。

  • 删除 versal_cips_0 与 pcie_block 之间复位信号的连接。

  • 根据上一步,Vivado 应提示“Run Block Automation”。 点击此提示。 Vivado 将弹出响应窗口。 验证 PCIe 参数是否正确,然后点击“OK”。 请注意,Vivado 还会提示“Run Connection Automation”,但此选项不够充分。

  • Vivado 将添加一个新的 pcie_block_support 模块并建立若干连接。

  • 移除与“sys_reset”相关的外部端口。相反,将 versal_cips_0 的 pl_pcie0_resetn 连接到两个模块的 sys_reset 输 入:pcie_block 和 pcie_block_support。 完成此操作后,“sys_reset”将像之前一样连接。

  • 选择 PCIe 模块所有未连接任何内容的引脚(可以使用 Ctrl 点击)。通过右键选择>Make External,将这些端口设为外部端口。Vivado 将为所有引脚 创建端口。每个外部端口的名称类似于网络名称,并添加“_0”后缀。

4.3.9 使用 XillyUSB

XillyUSB 可以在其他带有 SFP+ 接口的板卡上使用。此时只需设置设计的约束,使用连接到 SFP+ 连接器的 MGT。

板卡还需要为 MGT 提供 125 MHz 的低抖动参考时钟。尽管 USB 规范有要求,但不应启用扩频时钟(SSC)(如果存在此 类选项):如果使用 SSC 参考时钟,MGT 无法正确锁定接收信号。

对于自定义板卡,建议参考 sfp2usb 模块的原理图,因为 SFP+ 连接器的引脚直接连接到 FPGA 的 MGT。可以选择交换 SSRX 线,如 sfp2usb 模块所做。只有当这能简化 PCB 设计时才推荐这样做。

如果需要,也可以交换 SSTX 线。这需要编辑 *_frontend.v 文件,使发送位的极性反转,从而补偿线对交换。请注意,即使 不进行此编辑,USB 连接也有可能正常工作,因为 USB 规范要求链路伙伴即使在极性交换下也能正常工作。不过,建议不要依赖于 此。

4.4 用于指示 PCIe 通道数的 PRSNT 引 脚

根据 PCIe 规范,PCIe 连接器上有一个或多个引脚(PRSNT 引脚),用于指示外设在 PCIe 插槽中的存在以及通道数。大 多数开发板都有 DIP 开关,用于通过这些引脚调整告知主机的通道数。

这些引脚的典型默认设置是板卡可能的最大通道数。即使实际使用的通道较少,此设置通常也能工作。这是因为主机与外设 之间的初始协商(PCIe 规范要求)能够确保正确检测实际通道数。

请参考板卡参考手册了解如何设置这些 DIP 开关。注意不要将这些 DIP 开关设置为少于实际使用的通道数,因为某些主机可 能会因错误设置而忽略通道。

4.5 更改 PCIe 通道数和/或链路速 度

4.5.1 引言

重要 的:
更改链路参数可能需要调整时序约束。如果不注意此问题,可能导致 PCIe 链路虽然工作但不可靠。
在进行更改后,务必确保在必要时正确调整了时序约束。此主题将在下面详细说明。

Xillybus 的 FPGA demo bundle 通常设置为目标板卡上可用的最大通道数,链路速度为 2.5 GT/s(Gen1)。

理由在于:如果 FPGA 板卡能插入主板 PCIe 连接器,则可以预期所有通道都将在与主机的连接中使用。另一方面,在几乎 所有情况下,即使速度为 2.5 GT/s,这些通道所实现的带宽也高于 Xillybus IP 核可能利用的带宽,因此设置更高的链路速度毫无意义。

由于 PCIe 规范要求所有涉及的总线组件具备降速能力,因此选择 2.5 GT/s 可确保在所有主板上行为一致。

然而,通常需要更改通道数和链路速度,尤其是在自定义板卡上使用 Xillybus IP 核时。更少通道配合更高链路速度是常见需 求。

Xillybus IP 核依赖 AMD 的 PCIe 模块进行底层 PCIe 总线接口。因此,只要 AMD 的 PCIe 模块正常工作,无论通道数或链路速度如 何,IP 核都能正常工作。

如果 PCIe 模块配置为较少的通道数,与链路速度组合后的带宽能力低于 Xillybus IP 核所需,它仍能正常工作。此 时,Xillybus 流提供的总带宽大致等于 PCIe 模块设置所施加的带宽限制。问题在于哪个成为瓶颈。

4.5.2 工作流程

对于 Versal ACAP FPGA,请参考第 4.3.8 节。以下描述适用于所有 其他 FPGA。

原则上,更改通道数和/或链路速度包括按需更改 PCIe 模块的配置。但需要注意以下几个问题:

  • 修改可能会影响 PCIe 模块的其他参数,导致其无法正常工作。其中需要注意 AMD 图形用户界面工具中的一个 bug,详见下 文。

  • 修改可能会改变驱动 PCIe 模块的时钟频率(PIPE 时钟),因此需要更改时序约束。

  • 上述时钟频率的变化可能还需要更改支持 PCIe 模块的 Verilog 代码(如适用,即 pipe_clock 模块的例化),否则 PCIe 模块 将无法工作。

因此,步骤如下:

  1. 在活动项目中(即 Vivado 或 ISE 已根据需要升级 IP 之后)复制 XCO 或 XCI 文件。这将允许之后使用差异比较工具比较更 改,并发现不必要的更改(如果发生)。

  2. 在 Vivado(或 ISE)中打开 PCIe 模块的 IP 进行配置(对于 Versal FPGA,请打开 CIPS IP 中的 CPM 单元,这是 pcie_versal 块设计中的唯一模块)。

  3. 按需更改通道数和/或最大链路速度,同时注意不要更改(AXI)接口宽度。如果可以通过选择适合任务的通道数和链路速度 组合来避免更改(AXI)接口频率,则更可取。

  4. 进行所需更改后,验证 Vendor ID 和 Device ID 是否未更改(子系统对应 ID 也未更改)。某些 Vivado 版本可能会因无关修 改而将某些参数重置为默认值(这是一个缺陷)。

  5. 确认更改(通常点击对话框底部的“OK”)。如果之后提示生成输出产品(output products),则无需进行此操作。

  6. 使用文本差异比较工具比较更新前后 XCO 或 XCI 文件,并验证只有相关参数发生了更改。更多信息见下文。

  7. 调整 xillybus.v 和 xillydemo.v/.vhd 中 PCIE_* 的信号向量宽度,以反映新的通道数。

  8. 如有必要,调整 PIPE 时钟模块的例化,如下文第 4.5.3 段所述。

  9. 如有必要,调整时序约束,如下文第 4.5.4 段所述。

  10. 更新 PIPE 时钟模块,如第 4.5.5 段所述。

最后三个步骤在使用 Ultrascale 及后续 FPGA 时不需要。

在比较新旧 XCI 文件时,PARAM_VALUE.Device_ID 应特别注意,因为它经常被意外更 改。

XCI 文件参数中的差异应与期望的更改相匹配。以下是一份简短的可能参数列表,根据在 Vivado 中所做的更改,这些参数的变化是可接 受的。参数名称应谨慎对待,因为不同版本的 Vivado(进而不同版本的 PCIe 模块)可能使用不同的 XML 参数来表示 PCIe 模块的属性。

  • 与通道数相关的:

    • PARAM_VALUE.Maximum_Link_Width

    • MODELPARAM_VALUE.max_lnk_wdt

  • 与链路速度相关的:

    • PARAM_VALUE.Link_Speed

    • PARAM_VALUE.Trgt_Link_Speed

    • MODELPARAM_VALUE.c_gen1

    • MODELPARAM_VALUE.max_lnk_spd

  • 与接口频率相关的。 这些参数发生变化强烈表明第 4.5.34.5.4 段的步骤是必要 的。

    • PARAM_VALUE.User_Clk_Freq

    • MODELPARAM_VALUE.pci_exp_int_freq

4.5.3 PIPE 频率是否发生了变化?

在使用 Ultrascale 及后续 FPGA 时,以下考虑和操作是不必要的,因为其 PCIe 模块将时序约束作为 IP 本身的一部分提 供。PIPE 模块也是如此。

对于其他 FPGA 系列,必须按如下方式验证 PIPE 时钟设置是否正确:

在更改之后,为 PCIe 模块生成一个示例项目,并运行该项目的综合。在 Vivado 中,通常可以通过右键单击项目源层次结构 中的 PCIe 模块并选择“Open IP Example Design...”来完成。选择设计位置并生成后,通过点击左侧列的“Run Synthesis”启动综合。

接下来,获取综合报告中 PIPE 时钟模块的例化参数(在 Vivado 中,它类似于 pcie_example/pcie_example.runs/synth_1/runme.log)。在该报告中,搜索类似以下片段:

INFO: [Synth 8-638] synthesizing module 'example_pipe_clock' [...]
    Parameter PCIE_ASYNC_EN bound to: FALSE - type: string
    Parameter PCIE_TXBUF_EN bound to: FALSE - type: string
    Parameter PCIE_CLK_SHARING_EN bound to: FALSE - type: string
    Parameter PCIE_LANE bound to: 4 - type: integer
    Parameter PCIE_LINK_SPEED bound to: 3 - type: integer
    Parameter PCIE_REFCLK_FREQ bound to: 0 - type: integer
    Parameter PCIE_USERCLK1_FREQ bound to: 4 - type: integer
    Parameter PCIE_USERCLK2_FREQ bound to: 4 - type: integer
    Parameter PCIE_OOBCLK_MODE bound to: 1 - type: integer
    Parameter PCIE_DEBUG_MODE bound to: 0 - type: integer

此报告中的参数必须与 xillybus.v 中 pipe_clock 例化的参数匹配,其形式如下:

  pcie_[...]_pipe_clock #
     (
       .PCIE_ASYNC_EN               (   "FALSE" ),
       .PCIE_TXBUF_EN               (   "FALSE" ),
       .PCIE_LANE                   (   6'h08 ),
       .PCIE_LINK_SPEED           ( 3   ),
       .PCIE_REFCLK_FREQ            (   0 ),
       .PCIE_USERCLK1_FREQ          (   4 ),
       .PCIE_USERCLK2_FREQ          (   4 ),
       .PCIE_DEBUG_MODE             (   0 )
       )
     pipe_clock
        (
          [ ... ]
         );

需要比较的三个参数是 PCIE_LINK_SPEEDPCIE_USERCLK1_FREQ
PCIE_USERCLK2_FREQ,它们必须匹配。如果匹配(如示例所示),则所有设置(包括时序约束)均正 确。如果不匹配,则必须采取两项操作:

  • 必须更新 xillybus.v 中的例化参数,以匹配示例项目综合报告中的参数。

  • 时序约束必须适配到示例项目的约束。这更困难,因为未能正确执行此操作不一定立即导致问题,但可能影响设计的可靠 性。

如果 xillybus.v 中的 PCIE_LANE 参数大于示例项目中的值,则保持原样没有问题,而且通 常更容易这样做。

4.5.4 适配时序约束

如果 PCIe 模块的时钟发生了变化,则必须调整时序约束以反映这些变化。

由于约束取决于所选的 FPGA 以及 Vivado 版本,因此可能难以正确完成。避免进行此调整的主要动机是尝试通过选择链路 速度和通道数的组合(如有可能)来保持 PIPE 时钟频率不变。然而,即使 PIPE 时钟频率保持不变,更新约束可能仍然是必要的。

再次强调,当使用 Ultrascale(及后续)系列的 FPGA 时,无需处理时序约束,因为其 PCIe 模块的 IP 内部处理了这个问 题。

为了调整时序约束,首先找到示例项目的约束。在 Vivado 中,通常是一个类似
example.srcs/constrs_1/imports/example_design/xilinx_*.xdc 的文件。

强烈建议在更改通道数和/或链路速度之前生成一个示例项目,并在更改之后生成第二个示例项目。对两个示例项目的约束文 件进行简单的差异比较,可以明确回答是否需要适配约束,如果需要,如何适配。

将约束文件的“Timing constraints”部分与 xillydemo.xdc 中的对应部分进行比较。示例项目通过逻辑层次结构中的绝对位置选 择逻辑元素,因此需要进行一些编辑。例如,假设示例项目中有如下时序约束:

set_false_path -to [get_pins {pcie_vivado_support_i/pipe_clock_i/
pclk_i1_bufgctrl.pclk_i1/S0}]

在 xillydemo.xdc 中应写为:

set_false_path -to [get_pins -match_style ucf */pipe_clock/
pclk_i1_bufgctrl.pclk_i1/S0]

主要区别在于 Xillybus 约束中使用的相对路径。也可能存在其他细微差异,因为某些约束在 AMD 工具的早期版本中是必需 的,而在后期版本中则变得多余。

对时序约束进行更改后,务必通过审查设计实施后的时序报告来验证这些约束是否对逻辑生效。

最后,值得解释以下两个约束,它们出现在某些 demo bundle 的 xillydemo.xdc 中:

set_case_analysis 1 [get_pins -match_style ucf */pipe_clock/
pclk_i1_bufgctrl.pclk_i1/S0]
set_case_analysis 0 [get_pins -match_style ucf */pipe_clock/
pclk_i1_bufgctrl.pclk_i1/S1]

这些约束在较旧的 Vivado 版本中用于 Gen1 PCIe 模块是必需的,如 Xilinx AR #62296 所述。因此,在使用新的 AMD 工具时可以省略它们。

4.5.5 更新 PIPE 时钟模块

如上所述,此步骤对于 Ultrascale 及后续 FPGA 不是必需的。

在某些情况下,特别是将链路速度从 2.5 GT/s(Gen1)更改为其他速度或反过来时,需要更新位于 vivado-essentials/ 目录 中的 pcie_*_vivado_pipe_clock.v 文件。

该文件作为初始项目设置的一部分,通过执行 xillydemo-vivado.tcl 自动生成。它可能根据 PCIe 模块的配置(特别是是否限 制为 2.5 GT/s)而略有变化。

推荐的方法是使用 xillydemo-vivado.tcl 脚本重新生成 Vivado 项目。即,从新的 demo bundle 开始,并将之前阶段修改过的 文件复制到其中:

  • PCIe 模块的 XCI 文件

  • xillydemo.xdc

  • 为适配新通道数和链路速度而编辑的 Verilog / VHDL 文件

将这些文件复制到新的 demo bundle 后,使用 xillydemo-vivado.tcl 脚本生成项目可确保 PIPE 时钟模块与 PCIe 模块的设置 一致,并且项目不依赖于更改之前的任何残留文件。

或者,从第 4.5.3 段创建的示例项目中更 新 pcie_*_vivado_pipe_clock.v 文件。要使用的文件与 vivado-essentials/ 中的文件名称完全相同,通常位于示例项目文件层次结构的深处。 将此文件复制到 vivado-essentials/(覆盖现有文件)。

4.6 更改 FPGA 器件型号

当从一个 FPGA 系列迁移到另一个系列时,必须从不同的 demo bundle 开始。PCIe 模块(以及 XillyUSB 的 MGT 模块)存 在差异(有时很细微)。这些差异需要不同的 Xillybus IP 核以及不同的包装器模块。

尝试仅更改 Vivado / ISE 中的项目器件可能导致在实施过程中出现错误。即使实施成功,逻辑也可能无法工作或工作不可 靠。

但是,如果停留在同一 FPGA 系列内,更改器件型号通常就足够了(同时考虑上述关于引脚放置和约束的问题)。

需要特别注意的是,对于某些 FPGA 系列(尤其是 Ultrascale),PCIe 模块在逻辑阵列中的位置(site)是 PCIe 模块本身 的属性,因此可能需要修改。此外,每个特定的 FPGA 和每个特定的封装都有自己的一组有效 site。因此,如果为 PCIe 模块选择的 site 在新 FPGA 上不存在,则更改 FPGA 可能会重置 PCIe IP 的属性。

Vivado 对 PCIe 模块位置(site)无效的反应相当具有破坏性。如果发生这种情况,PCIe 模块的“升级”(更改 FPGA 后解锁 IP 所必需的 操作)会导致将 PCIe 模块的若干属性重置为任意值。同时,会产生类似以下的关键警告:

CRITICAL WARNING: [IP_Flow 19-3419] Update of 'pcie_ku' to current project
options has resulted in an incomplete parameterization. Please review the
message log, and recustomize this instance before continuing with your design.

忽略此问题而尝试实施项目是完全没有意义的,不仅会导致大量误导性的警告、关键警告以及可能的错误,而且结果(如果 有)也远非功能正常。

解决方法是在更改项目的器件型号属性之前,为新 FPGA 分配一个有效的 PCIe 模块 site。如果更改前后的 FPGA 器件之间 没有共同的 site,则可能需要手动编辑 XCI 文件(因为在这种情况下,无法在 GUI 中进行此更改,GUI 将设置限制为当前 FPGA 器件允许的 site)。