引言
IP Core Factory 是 Xillybus 网站上的一款在线工具,可让您根据具体应用需求,灵活配置 IP 核的参数与数据流。配置完成后,只需点击网页上的“生成核”链接,即可提交该 IP 核进行生成。稍等片刻(通常只需几分钟),IP 核的网表及相关文件便会打包成一个 ZIP 文件,供您下载。
这个 ZIP 文件中还包含一份 README 文件,其中记录了所生成 IP 核及其各个数据流的实际参数。这些参数可能与您最初请求的设置略有不同。
下载得到的 IP 核功能完整,可直接用于 FPGA 项目,没有任何技术限制。从法律角度讲,该 IP 核仅允许用于评估目的或特定的学术用途,具体说明请参阅这份指南。
使用本服务只需提供一个有效的电子邮箱地址即可。
一般来说,IP Core Factory 可生成三种类型的 IP 核:主流的 Xillybus IP 核,用于通过 PCIe / AXI 总线在计算机主机与 FPGA 之间通信;XillyUSB,通过 USB 3.0 实现相同功能;以及 Xillyp2p,用于通过 MGT(多吉比特收发器,常称为 GTX、GTH、GTY 等)、其他类型的 SERDES 或 FPGA 之间的并行连线,来连接两块 FPGA。
有关 Xillybus 和 XillyUSB IP 核的更多信息,请参阅主文档页面。
Xillyp2p IP 核的定义包含两个阶段:
- 选择目标 FPGA 系列,并设置物理数据链路的参数。
- 设置用于传输应用数据的数据流。
该网页应用的操作非常直观,并附带了带有相关信息的帮助按钮。不过,本指南仍会就几个主题进行补充说明,以作为这些帮助按钮的辅助。
Core A 与 Core B 的术语说明
与 IP Core Factory 生成的其他类型 IP 核不同,Xillyp2p 的 IP 核包含两个独立的逻辑块,分别称为 core A 和 core B。这是很自然的,因为所建立的链路连接两块 FPGA,而链路两端之间的关系未必是对称的。
IP Core Factory 会将这两个逻辑块作为两个独立的逻辑网表提供,每个网表都附有其黑盒文件(如果需要)和实例化模板。要连接两块 FPGA,第一块 FPGA 的逻辑设计应包含 core A,第二块则应包含 core B。
“Xillyp2p IP 核” 这一表述通常指 core A 和 core B 两者共同构成的整体,多用于描述它们的联合配置。请不要将其与 “core A / core B” 术语混淆,后者特指两个 FPGA 项目中各自包含的某个具体逻辑网表。
关于如何创建对称的 IP 核,使得一块 FPGA 能够与另一块使用相同逻辑块(即 core A 对 core A)的 FPGA 连接,请参见下文指南。
对于单向的 Xillyp2p IP 核,数据从 Core A 流向 Core B。
IP 核的基本参数
首先,需要配置一些基本参数:
- IP 核名称。该名称没有实际工程意义,仅用于网站显示以及最终生成的 ZIP 文件命名。
- IP 核的目标 FPGA 器件(一个或两个):Core A 和 Core B 可以面向同一 FPGA 系列,也可以面向两个不同的系列。
- IP 核是双向还是单向。只要可能,建议选用双向,即使应用只打算往一个方向传输数据。在这种情况下,反方向的物理链路会被 Xillyp2p 协议用于确认数据正确接收、请求重传,或为各个应用数据流提供流控。当然,反方向的物理链路数据速率可以显著低于正向链路。
- 应用类型。这一选择可能对核的内部参数产生微小影响,带来轻微的性能差异。
- 链路延迟:用于配置链路延迟的文本框仅对某些应用类型可见,例如光纤通道,其链路延迟可能较大。当该文本框可见时,应填入数据在物理链路上从 core A 传输到 core B(或反方向)所需的时间。如果两个方向上的延迟不同,请填写平均延迟。该参数影响 RAM 缓冲区的分配,如果设置不当,会影响带宽性能。
时钟频率与容差
当物理链路为双向时,用户应用逻辑需要向 Xillyp2p IP 核提供两个时钟,这两个时钟通常由物理链路逻辑产生或与其相关。
- 发送时钟 tx_clk,用于对发送的并行字进行时钟同步。该时钟由发送端的电路中的振荡器产生。
- 接收时钟 rx_clk,通常由到达的比特流中恢复得出。
由于 IP 核的逻辑需要使用这两个时钟,它们的频率应合理,以便在目标 FPGA 上满足时序约束。250 MHz 的时钟频率在大多数目标器件上都能良好工作;但如果您可以在频率与并行字位宽之间进行权衡(详见下文),那么最好将频率目标设定在 120–200 MHz 范围内。当然,在一些更快的 FPGA 上,300–350 MHz 也可能可行。
没有最低时钟频率限制(只要 FPGA 本身支持即可)。
对于单向物理链路,每侧仅使用一个时钟。此时,只需在 IP Core Factory 中指定该时钟的频率,本节其余内容均不适用。
当物理链路为双向时,tx_clk 与 rx_clk 的频率必须大致相等,允许的容差为 125,000 ppm(百万分之125,000),即 12.5% 的频率容差。如果两个方向需要不同的数据速率,可以通过为物理链路的并行数据字选择不同的位宽来实现。
在 IP Core Factory 中配置 IP 核时,需要提供这两个时钟的频率以及最大频率容差。容差定义为每个时钟相对于其标称频率的偏差。这涵盖了所有可能的偏差来源:时钟振荡器自身的容差(例如老化、温度)以及 SSC(扩频时钟,若使用)。所有这些容差应相加得到最终数值。
由于两个时钟都可能存在这种偏差,它们之间可能的最大频率差约为两侧容差之和的两倍。
Xillyp2p IP 核通过在物理链路的数据流中插入空闲段来处理频率容差,这会对有效数据量产生限制。如果没有这种限制,接收端可能因无法及时将数据交付给应用而面临数据溢出的风险。
因此,较高的时钟频率容差会降低有效数据带宽。不过,典型的时钟容差(例如 100 ppm)带来的影响可以忽略不计。
请求使用 out_ready 和 in_valid 端口
在时钟频率文本框旁边,有一个复选框,标签为“每个时钟周期传输/接收一个并行字”。对于大多数应用,尤其是在 Xillyp2p IP 核直接连接 MGT 的情况下,此复选框应保持选中状态。
当取消选中此复选框时,Xillyp2p IP 核与物理链路对接时会增加两个输入端口:发送侧的 “out_ready” 和接收侧的 “in_valid”。对于双向物理链路,两侧都会增加这两个端口。这些输入端口充当并行字的时钟使能信号。
从 AMBA / AXI 术语的角度来看:out_ready 对应于 valid/ready 对中的 “ready” 信号,用于 out_data,但并未提供 “valid” 信号,因为 out_data 总是有效的。类似地,in_valid 对应于 in_data 的 valid/ready 对中的 “valid” 信号,但未提供 “ready” 信号,因为 IP 核总是准备好接收一个并行数据字。
换句话说,当 out_ready 为高电平时,Xillyp2p IP 核假定 out_data 的内容将被发送到物理链路上;否则,out_data 的值会在下一个时钟周期保持不变。同样,当 in_valid 为低电平时,IP 核会忽略 in_data 的内容。
out_ready 和 in_valid 适用于用户应用逻辑需要操控物理链路数据的场景。如果这种操控导致并行字流不规则,这两个端口便可实现该数据流与 IP 核的对接。例如,在应用逻辑中实现的变速齿轮箱可能无法在每个时钟周期都产生一个并行字。也可以在并行字流中插入一个 FIFO(注意不要与应用数据 FIFO 混淆)。
例如,如果使用一个 FIFO 来向物理链路发送数据,则可以将 out_ready 以及该 FIFO 的 wr_en 输入都连接到该 FIFO 自身的 “full” 输出的反相。这种安排允许物理链路的发送端以任意期望的速率从 FIFO 的另一侧读取数据。
对 out_ready 和 in_valid 为高电平的频率没有要求。但是,当在 IP Core Factory 中选择使用这两个端口时,需要在定义并行字位宽的章节中估算它们为高电平的时间百分比。这个百分比称为 “utilization ratio”。利用该估算值,IP Core Factory 可以分配足够支持适当数据速率性能的 RAM 缓冲区资源。
并行字位宽
核配置第一阶段的最后一步是选择并行字的位宽。Xillyp2p 允许的并行字位宽范围为 1 到 128 位(含)。发送和接收的位宽可以不同。但是,core A 用于发送的并行字位宽必须与 core B 用于接收的位宽相同,反之亦然。例如,一个 MGT 可能以 80 位并行字向 core A 发送数据,并以 20 位接收数据。在这种情况下,连接到 core B 的 MGT 必须使用 20 位进行发送,使用 80 位进行接收。
回顾上文,用于发送和接收的并行字所对应的时钟频率必须大致相同(在容差范围内;参见上文)。因此,如果物理链路在发送和接收方向需要不同的数据速率,可以通过选择不同的字位宽来实现。
当使用 MGT 或 SERDES 时,针对给定的数据速率,通常有不同的时钟频率与并行字位宽组合可供选择。更宽的并行字可以降低时钟频率,这在某些情况下有助于更容易地满足时序约束 – 但同时也可能导致 Xillyp2p 的逻辑消耗增加。尤其需要注意两个阈值点:32 位和 64 位。选择 33 位而不是 32 位,或者 65 位而不是 64 位,会导致逻辑消耗显著增加。这与 Xillyp2p IP 核内部数据字的位宽有关。对于双向物理链路,并行字位宽对逻辑消耗的影响是每个方向独立的。
例如,MGT 通常允许在 32 位和 40 位之间选择。如果目标 FPGA 容量较小,因而对逻辑消耗较为敏感,那么选择 32 位可能更优。当目标 FPGA 容量大且大部分资源未被使用时,选择更宽的位宽是有利的,因为这有助于降低时钟频率,从而更容易、更快地满足时序约束。但将时钟频率推到 120 MHz 以下很可能是没有意义的。
设置数据流
在配置完 IP 核的通用参数后,接下来设置应用数据流。
可以定义任意数量的数据流。每个数据流都是独立的,并且仅在需要向对侧传输数据时才高效地占用物理链路的带宽。特别地,如果某个数据流在某一时刻没有数据发送,它不会消耗物理链路的任何资源。
对于每个数据流,需要配置以下参数:
- 数据流名称。该名称会出现在 Xillyp2p IP 核与该数据流相关的端口名称中(core A 和 core B 上都有)。应使用这种命名约定,以确保应用数据能够到达对侧正确的逻辑模块。数据流的名称不会出现在实现的逻辑中,因此它在 FPGA 设计流程之外没有实际意义。
- 数据宽度:这是连接到应用逻辑 FIFO 的端口上数据字的位宽。因此,它也是该 FIFO 数据字的位宽(至少在面向 IP 核的一侧)。可选值为 8、16、32、64、128 或 256 位。该位宽与物理链路的位宽无关,也不会影响性能。因此,建议选择对应用来说最自然的位宽。
- 所需带宽:这是该数据流应能支持的最大数据速率。建议指定应用实际需要的数据速率。将某个数据流配置为高于实际所需的速率可能会浪费 FPGA 资源。请注意,如果多个数据流同时处于活动状态,它们会竞争物理链路的带宽,并且它们的总数据速率不能超过该带宽。应用逻辑不应依赖 Xillyp2p 将数据速率限制在请求的数值上,即使这种情况可能发生。
对于双向物理链路,还需要配置以下两个参数:
- 方向。数据流可以配置为从 A 到 B、从 B 到 A,或双向。一个双向数据流实际上由两个方向相反、名称相同的数据流组成。这更容易引起混淆而非带来好处。因此,除非需要对称 IP 核(详见下文),否则不建议使用双向数据流。
- 启用流控。当选中该复选框时,IP 核与应用逻辑 FIFO 的接口上会添加一个 “full” 输入端口。通过使用这个输入,Xillyp2p 核能够保证不会导致该 FIFO 溢出,这是借助于一个针对每个数据流独立且专用的流控机制实现的。这使得接收侧的应用逻辑能够有效地控制一直回到发送侧应用逻辑的数据流,从而产生一种 FIFO 被拆分在两块 FPGA 上的实用错觉。
将 core A 连接到自身(另一个 core A)
可以配置一个 Xillyp2p IP 核,使其能够连接到自身。换句话说,使得 core A 与 core B 完全相同。这样,一个包含 core A 设计的 FPGA 就能连接到另一个包含相同 core A 设计的 FPGA。特别地,这使得两块烧写完全相同比特流的 FPGA 可以相互连接。
正如 另一份指南 中提到的,IP 核通常会拒绝链路伙伴,除非对方是同一个 Xillyp2p IP 核对应的 A/B 配对。这种拒绝会通过 status_link_partner_mismatch 输出端口指示,当不匹配发生时,该端口保持高电平。
为了让 core A 能够连接到自身,Xillyp2p IP 核必须是对称的。要实现对称,需满足以下要求(这些要求共同构成充要条件):
- 物理链路是双向的。
- 两个方向的物理链路并行字位宽相同。
- 所有数据流都是双向的。
- “每个时钟周期传输/接收一个并行字”复选框被选中;如果未选中,则两个方向的利用率百分比配置值必须相同。
当 IP 核是对称的且可以连接到自身时,README 文件的头部会出现一条提示。例如:
Configuration ID: 0xbc5aed42, symmetric (core can connect to itself)
此处配置 ID 取决于核的具体设置,而表示核为对称的文本如上高亮所示。
