Overview
Navigating Content by Design Process
Core Overview
本章概述了 ERNIC IP Core以及应用程序、许可要求和标准一致性的详细信息。 ERNIC 是一种通过融合以太网 (RoCE v2) 协议实现 RDMA 的软 IP,用于嵌入式目标或发起设备。 该实现基于 InfiniBand Artchitecture Specification Volume 1 ,附件A16 RoCE 和附件17 RoCE V2 [参考文献 1] 中描述的规范。
图 1-1 显示了 ERNIC 及其与子系统中其他 IP 的连接。
Figure 1-1: ERNIC IP Block Diagram
注意:连接到 ERNIC 的 user logic 或 target IP 称为应用程序,箭头方向是从 master 到 slave。
除了 ERNIC IP,ERNIC 子系统还包括 Xilinx Ethernet IP (CMAC)、AXI DMA 和 AXI Interconnect以及其他 IP。 在用户应用程序前端,ERNIC IP 公开了边带接口(side band interfaces),无需通过互连即可实现高效的门铃交换。
每个队列由一组读写指针标识,称为Producer Index(写指针)和Consumer Index(读指针)。 这些指针的寄存器地址位置在本文档中称为门铃。 门铃交换或门铃响铃表示相应的寄存器位置已更新。
Feature Summary
ERNIC IP 使用 AXI4-Stream 接口与任何Ethernet MAC IP 接口交互。访问 DDR 或任何其他内存区域对用于读取和写入 RDMA 数据包处理的各种数据结构是必要的。这种连接是使用多个 AXI4 接口实现的。 IP 在 512 位内部数据路径上工作,可以完全硬件加速且无需任何软件干预数据传输。所有可恢复的故障(例如由于丢包而导致的重传)也完全在硬件中处理。
ERNIC IP 实现嵌入式 RNIC 功能。因此,与通用 RNIC 相比,仅实现了以下 RoCE v2 功能子集:
- 支持传入和传出数据包的 RDMA SEND、RDMA READ、RDMA WRITE、RDMA SEND INVALIDATE、RDMA SEND IMMEDIATE 和 RDMA WRITE IMMEDIATE。不支持原子操作。
- 支持多达 254 个连接。
- 多达 255 个 RDMA 队列对的可扩展设计。
注意:默认 Vivado 策略允许定时传递多达 127 个队列对。要匹配 255 个队列对的时序,请使用 Vivado 策略 — Performance_refinePlacement。
- 支持动态内存注册。
- 硬件握手机制,用于与用户应用逻辑进行有效的门铃交换。
注意:在握手模式下切换时,上层在该特定 QP 上不应有任何流量。
ERNIC Module
ERNIC IP 由本节介绍的以下主要模块组成。
- QP Manager
- WQE Processor Engine
- RX PKT Handler
- Response Handler
- Flow Control Manager
QP Manager
QP Manager模块包含所有 QP 的配置,并为处理器提供 AXI4-Lite 接口。它还对各种 SEND Queue进行仲裁并缓存 SEND 工作队列条目 (Send Work Queue Entries, WQE)。然后将这些 WQE 提供给 WQE 处理器模块进行进一步处理。该模块还处理重传时的 QP 指针更新。
WQE Processor Engine
WQE Processor Engine从 QP 管理器模块读取缓存的 WQE 并处理以下任务:
- 验证传入的 WQE 是否存在任何无效的操作码 (invalid opcode)。
- 根据有效负载最大传输单元 (PMTU) 为 RDMA 数据包创建header,并对内部 DMA 引擎进行编程。
- 它还触发 DMA 开始传出数据包传输。
WQE Processor Engine还负责为传入的 RDMA SEND/WRITE 请求发送传出确认数据包 (acknowledgment packets, ACK),并为传入的 RDMA READ 请求发送读取响应 (read responses)。
RX PKT Handler
RX PKT Handler模块接收传入的 RDMA 数据包。在 RX PKT Handler (roce_cmac_s_axis) 接口接收之前,应过滤掉非 RDMA 数据包。 ERNIC IP 处理以下类型的传入 RoCE v2 数据包:
- RDMA SEND、RDMA WRITE、RDMA READ 和 RDMA READ(从 ERNIC 发出的请求) 的响应数据包
- RDMA SEND with Invalidate, RDMA SEND with immediate, RDMA WRITE with immediate packet
- RDMA WRITE/RDMA SEND (从 ERNIC 发送的请求)的确认数据包 (ACK)
- 到 QP1 的通信管理(管理数据报)数据包
RX PKT Handler 模块负责验证传入的数据包。它还为传入的 RDMA SEND 和 RDMA WRITE 请求触发传出确认数据包,并将通过验证的数据包推送到相应的内存位置。 RDMA READ 的响应数据包直接传送到目标应用程序。模块处理传入的 RDMA READ 请求并将请求转发到 TX 路径。
RX PKT 处理程序模块还解码 RDMA SEND 无效/立即和 RDMA WRITE 立即数据包。 IETH 或 IMMDT headers中的 32 位数据在单独的 AXI4-Stream 接口上提供。 在这个流接口上为每个条目提供了 64 位数据。 下表显示了这 64 位的编码。
Table 1-1: Invalidate/Immediate Data Entry Structure
需要实现外部硬件逻辑来处理此接口上提供的无效/立即数据。例如,AXI DMA IP 将流接口 (AXIS)转换为 AXI 内存映射接口 (AXI MM),并将数据写入特定位置并通知软件或硬件应用程序。
用于RDMA traffic的外发的暂停请求 (Pause requests)在此模块内处理。当剩余的缓冲区位置达到 XON 条件时,它触发 Pause ON 并在缓冲区指针达到 XOFF 条件时取消断言。
Response Handler
Response Handler模块管理未完成的队列。这些队列保存有关发送到远程主机但尚未确认或响应的所有数据包的信息。此外,如果远程主机发送否定确认 (NAK),此模块会触发重新传输。如果该模块在指定的时间(timeout value)内没有收到远程主机的响应,则触发超时相关的重传。
由于传入的 NACK 或内部超时会触发重传。 当触发重传时,ERNIC IP 负责以下事项:
- 标识要重传的 PSN 和 MSN 值。
- 回滚该队列对(Queue Pair)的 PSN 和 MSN 值。
- 将当前的SQ指针回滚到需要重传的WQE。
- ERNIC 在重试的情况下重新传输完整的 WQE。不支持部分 WQE 重传。
Flow Controll Manager
该模块在 RX 路径中维护单独的缓冲器,并根据这些缓冲器的可编程满状态生成 PFC 控制信号。同样在 TX 路径中,它也有两个独立的 RoCE 和非 RoCE 缓冲区。在任何暂停信号断言时,模块将停止从缓冲区读取。
Product Specification
ERNIC IP 提供了支持 RoCE v2 的 NIC 的嵌入式实现。 RDMA 技术允许通过标准以太网更快地移动数据,同时完全卸载 CPU 带宽。 ERNIC IP Core随附可移植到任何 Zynq® MPSoC 或 FPGA 设备的软件驱动程序。 这允许 ERNIC IP 独立于任何外部处理器运行。
RDMA Enabled NIC
Xilinx® Embedded RDMA enabled NIC (ERNIC) 控制器可以使用以下方法之一与任何用户应用程序交互:
- 紧密集成的硬件握手机制,为目标系统提供低延迟、轻量级的接口
- OFED-complaint RDMA 硬件驱动程序和用户空间库,提供标准 SW API 以向 ERNIC 发布工作请求
图 2-1 显示了具有多个主机 CPU 和多个本机 NVMe 设备的示例端到端系统,这些设备通过 Xilinx ERNIC + NVMEOFABRIC IP 子系统在网络结构上进行通信。
图 2-1:Xilinx ERNIC + NVMe over Interconnect
图 2-1 所示的主机端启用 RDMA 的 NIC (RNIC) 需要支持 RoCE v2 技术。以下部分描述了 ERNIC 实现中使用的关键数据结构。
Work Requests/Work Queue Entries (WQE)
工作请求(Work Request)用于向 ERNIC IP 提交工作单元。 应用程序可以发布到发送工作队列(Send Work Queue)的操作是:
- RDMA Write
- RDMA WRITE Immediate
- RDMA SEND
- RDMA SEND Immediate
- RDMA Read
- RDMA SEND Invalidate
不允许以下工作请求:
- ATOMIC
- Bind Memory Window
- Local Invalidate
- Fast Register Physical MR
接收队列工作(Recieve Queue Work)请求不需要由应用程序发布,因为 ERNIC 硬件会根据配置的接收队列深度自动重新发布消耗的接收缓冲区。
表 2-1 显示了发送工作请求的结构。 每个工作队列条目 (WQE) 的大小为 64 字节。
Table 2-1: WQE Structure
Work Completions
发送队列(SQ)上发布的每个 WQE 都会发布工作完成(WC)。 接收队列 (RQ) 条目的完成不会发布,而是在传入的 RDMA SEND 请求消耗新的接收缓冲区时,在 RQWPTRDBADDi 指向的地址处的每个队列对 (QP) 敲响门铃。 完成队列条目 (CQE) 的结构在表 2-2 中给出。 每个 CQE 大小为 4 个字节。
Table 2-2: Completion Queue Entry Structure
RDMA Queues
ERNIC IP 实现以下 RDMA 队列,如接收队列 (Recieve Queue, RQ)、发送队列 (Send Queue, SQ) 和完成队列 (Completion Queue, CQ)。 这些队列称为队列对(Queue Pairs)或 QPs。 SQ 包含用户应用程序发布的send WQE。
Figure 2-2: RDMA Queues
RQ 容纳传入的 RDMA SEND 数据包。 完成队列通知用户应用程序有关已完成的 SEND WQE。 这些队列中的每一个都被实现为循环缓冲区。 各种门铃和写指针寄存器定义了这些队列的当前状态。 图 2-2 显示了不同的队列和定义队列状态的变量/寄存器。 突出显示的变量由 ERNIC IP 间接访问。 寄存器 CQDBADDi 指向 sq_cmpl_db 的地址,而 RQWPTRDBADDi 寄存器指向 rq_wrptr_db 的地址。
这些队列在 ERNIC IP 之外的内存区域中实现。 ERNIC 通过各种 AXI master 接口访问 IP。 有关 ERNIC 内存要求的详细信息,请参见表 3-2。
接下来的几节简要概述了 ERNIC IP 的传入 (RX) 和传出 (TX) 数据流。
ERNIC RX PATH
ERNIC RX Path 通过 AXI4-Stream 接口从 MAC (网卡)获取数据包数据。 如果 XRNICCONF[5] 的值设置为 1,则验证所有传入的数据包,并且所有未通过数据包验证的数据包 headers 都将发送到错误缓冲区(由 ERRBUFBA[31:0] 指定的基地址)。 根据表 2-3,ERNIC RX packet handler 模块为 header 加上错误综合症 (error syndrome) 前缀。 这些缓冲区为传入的数据包错误提供有用的调试信息。
Table 2-3: Packet Validation Error Syndrome
大多数数据包验证错误完全由硬件处理,不需要软件干预。 但是,如果传入的数据包导致 QP 进入 FATAL 状态,则需要软件干预来处理错误并启动断开连接。 此类错误在由 IPKTERRQBA、IPKTERRQSZ 和 IPKTERRQWPTR 寄存器定义的传入数据包错误状态缓冲区中,可用于 SW。 每个错误状态缓冲区条目都是 64 位宽的。 错误状态的格式如图 2-3 所示。
Figure 2-3: Error Status Format
Fatal table decoding is shown in Table 2-4.
Table 2-4: Decoding for FATAL Codes
传入的 RDMA SEND/WRITE/READ 请求应该连接在RX端。所有其他类型的数据包都是传出请求的响应数据包。 传入 RDMA SEND 请求的数据流如图 2-4 所示。 箭头的方向显示数据流。 在连接的 QP 上接收到有效的 RDMA SEND 传入数据包时,数据包内容(不包括标头)被推入相关 QP 的 RX 缓冲区。 根据 QPCONFi[4] 的配置,ERNIC 使用边带接口 (side band interface) 或通过 AXI 接口,响起 RQ Producer Index Doorbell (RQPI DB),以指示新数据包可用。 此时还会向远程主机发布确认 (ACK)。 用户应用程序可以通过敲响 RQ Consumer Index Doorbell (RQCI DB) 来通知 ERNIC 已消耗新数据包。 收到此门铃后,相应的 RX 缓冲区可用于新传入的数据包。
Figure 2-4: RDMA SEND RX Data Flow
对于任何 RDMA 设备上的传入 RDMA READ/WRITE 请求支持以及向网络中的其他 RDMA 设备发送读/写请求,设备应该知道目标 RDMA 客户端的地址、长度和 RKEY。 为此,应用层应实现自己的协议,以便在任何数据传输之前交换地址和 RKEY 值。 图 2-5 和图 2-6 中的示例显示了一个额外的 RDMA_SEND 操作,用于交换 RDMA READ/WRITE 事务所需的详细信息。 当详细信息交换时,RNIC 将向 ERNIC 发送 RDMA READ/WRITE 数据包,ERNIC 将以 RDMA read response 或 ACK 进行响应。 图 2-5 显示了 RDMA READ 事务的数据流。 图 2-6 显示了 RDMA WRITE 事务的数据流。
Figure 2-5: RDMA READ Request RX Data Flow
Figure 2-6: RDMA WRITE Request RX Data Flow
ERNIC TX PATH
TX 路径由传出 RDMA READ、RDMA WRITE 事务和传入 RDMA SEND/WRITE 请求的 ACK 数据包和传入 RDMA READ 请求的响应组成。基于 SQPIi 门铃,处理发送工作队列(Send Work Queue)请求。 DMA 模块配置为所有传出事务的数据传输。 RDMA WRITE/SEND 的 TX 数据流如图 2-7 所示。
用户应用程序通过在特定 QP 的 SEND Queue 上发布 WQE 并响起相应的 SQ Producer Index Doorbell (SQPI DB),来请求 ERNIC IP 传输 RDMA WRITE/SEND/READ 数据包。 ERNIC 处理 WQE 并根据 WQE 中提供的信息为 RDMA WRITE/SEND 命令提取数据。该数据连同相关 headers 一起被推送到链接上。一旦收到来自远程主机的确认 (ACK packet) ,ERNIC 会通过发布 CQE(基于 QPCONFi[5] 的配置)和通过边带接口 (side band interface) 发布完成计数,来通知用户应用程序 WQE 成功完成。相应的 QP 的 CQHEAD 也会更新。对于 RDMA READ 请求,RX packet handler 提示 TX 路径。对于此通信,每个 QP 都有一个未完成的读取请求队列 (read request queue)。队列的深度由传入请求资源的参数确定。当未完成的读取请求队列已满时,它会被指示给 RX 路径。对 QP 的任何进一步请求都将导致 NAK-Invalid 并且 QP 进入致命状态 (fatal state)。
注:箭头方向表示数据流向。
Figure 2-7: RDMA SEND/WRITE Data Flow
图 2-8 显示了从 ERNIC 到远程主机的 RDMA READ 请求流。
Figure 2-8: RDMA READ Data Flow
图 2-8 显示了从 ERNIC 到远程主机的 RDMA READ 请求的流程。 用户应用程序请求 ERNIC IP 向远程主机发送 RDMA READ 请求,方法是在特定 QP 的 SEND Queue 上发布 WQE 并响起相应的 SQ Producer Index Doorbell (SQPI DB)。 ERNIC 处理 WQE 并创建带有相关 headers 的请求数据包并将其推送到链路上。 一旦从远程主机接收到响应数据包,ERNIC 将数据(在删除标头后)写入 WQE 中提供的本地缓冲区地址。 然后它通过发布 CQE(基于 QPCONFi[5] 的配置)并通过边带接口发布完成计数,来通知用户应用程序 WQE 成功完成。 相应 QP 的 CQHEAD 也会更新。
STANDARDs
PERFORMANCE
RESOURCE ULTILIZATION
PORT DESCRIPTIONS
PARAMETER DISCRIPTIONS
REGISTER SPACE
所有 ERNIC 寄存器都与 AXI4-Lite 域同步。 以下寄存器表中未指定的任何位都被视为保留,并在读取时将值返回为 0。 除非在定义中指定,否则控制寄存器的上电复位值为 0。 除非另有说明,否则您应该始终使用 0 写入保留位置。 下表中仅列出了地址偏移,并且基地址由 AXI interconnect 在系统级别进行配置。 保护域表的内容用于头部验证,如下图所示。
Figure 2-9: PDT Table Implementation