QSFP28、RoCEv2、RFSoC-4x2 数据传输过程详解

📅 2026/7/22 18:25:28
QSFP28、RoCEv2、RFSoC-4x2 数据传输过程详解
1MB 数据通过 RoCEv2 协议从 RFSoC-4x2 传输到另一台 RFSoC-4x2的完整数据流过程。重点展示串并转换、并串转换的每个细节以及跨器件时的协议封装/解封装。一、传输概览参数数值数据量1 MB 8,388,608 bits线速率100 Gbps (4×25.78125 Gbps)理论最小时间≈ 84 μs实际传输时间≈ 100-120 μs含协议开销每通道速率25.78125 GbpsUI (Unit Interval)38.788 ps二、发送端 RFSoC-4x2 详细数据流步骤 ①Host CPU → Verbs API┌─────────────────────────────────────────┐ │ Host CPU (ARM Cortex-A53 / RISC-V) │ │ 应用层调用 ibv_post_send() │ │ - 指定 QP #42 (Queue Pair) │ │ - 1MB 数据已注册到 Memory Region (MR) │ │ - 生成 SGE (Scatter-Gather Entry) 列表 │ │ - 通常每 SGE 4KB共 256 个 SGE │ └─────────────────────────────────────────┘ ↓ PCIe Gen3 x8 TLP (Transaction Layer Packet) ↓关键操作CPU 不直接拷贝数据而是通过 DMA 描述符告诉网卡数据在哪里。步骤 ②PCIe → DMA Engine┌─────────────────────────────────────────┐ │ DMA Engine (FPGA 内部硬核/软核) │ │ - 读取 Host 内存中的 SGE 列表 │ │ - 按 SGE 分段从 Host DDR 取数 │ │ - 每段 4KB通过 PCIe TLP 读取 │ │ - 写入 FPGA 内部 TX Buffer (BRAM/URAM) │ └─────────────────────────────────────────┘ ↓ 并行数据总线: 512-bit ~200 MHz (PCIe 有效带宽) ↓数据形态此时数据仍是字节流1MB 被切分为 256 个 4KB 块。步骤 ③RDMA 引擎封装┌─────────────────────────────────────────┐ │ RDMA 引擎 (FPGA 软逻辑实现) │ │ 对每个 4KB 块封装 RDMA 协议头: │ │ │ │ ┌─────────┬─────────┬───────────────┐ │ │ │ BTH │ RETH │ Payload │ │ │ │ 12B │ 16B │ 4KB │ │ │ │ │ │ │ │ │ │ - Opcode│ - VA │ (实际数据) │ │ │ │ - PSN │ - RKey │ │ │ │ │ - QPN │ - DMA Length │ │ │ └─────────┴─────────┴───────────────┘ │ │ │ │ 1MB → 256 个 RDMA Write 包 │ │ 每包 Payload 4KB │ │ 加上头后每包 ≈ 4KB 28B │ └─────────────────────────────────────────┘ ↓ 并行数据总线: 512-bit 312.5 MHz ↓BTH (Base Transport Header)Opcode:RDMA_WRITE_ONLY(0x14)PSN (Packet Sequence Number): 0, 1, 2, … 255QPN (Queue Pair Number): 42P_Key: 0xFFFFRETH (RDMA Extended Transport Header)Virtual Address: 接收端 MR 的虚拟地址R_Key: 接收端内存区域的密钥DMA Length: 4096步骤 ④RoCEv2 协议栈封装┌─────────────────────────────────────────┐ │ RoCEv2 协议栈 (UDP/IP/Eth 封装) │ │ │ │ ┌────────┬────────┬────────┬────────┐ │ │ │ Eth │ IP │ UDP │ RDMA │ │ │ │ Header │ Header │ Header │ Packet │ │ │ │ 14B │ 20B │ 8B │ 4KB28B│ │ │ │ │ │ │ │ │ │ │ - DMAC │ - SIP │ - Sport│ │ │ │ │ - SMAC │ - DIP │ - Dport│ │ │ │ │ - VLAN │ - TTL │ 4791 │ │ │ │ │ │ - TOS │ │ │ │ │ └────────┴────────┴────────┴────────┘ │ │ │ │ 每包总大小 14 20 8 28 4096 │ │ 4166 bytes │ │ 1MB 实际发送 ≈ 256 × 4166B ≈ 1.067 MB │ └─────────────────────────────────────────┘ ↓ 并行数据总线: 512-bit 312.5 MHz ↓UDP 目的端口 4791IANA 分配给 RoCEv2 的标准端口。步骤 ⑤CMAC US (MAC 层)┌─────────────────────────────────────────┐ │ CMAC US (100G Ethernet 硬核) │ │ │ │ 输入: 512-bit 数据总线 312.5 MHz │ │ (每周期 64 bytes 512 bits) │ │ │ │ MAC 层操作: │ │ 1. 添加 Preamble (7B) SFD (1B) │ │ 2. 计算 FCS (Frame Check Sequence) │ │ CRC32 多项式: x^32 x^26 ... 1 │ │ 3. 添加最小帧间隙 (IPG 12B) │ │ │ │ 输出: 完整 Ethernet 帧 │ │ 每帧 8(PreambleSFD) 4166 4(FCS) │ │ 4178 bytes │ └─────────────────────────────────────────┘ ↓ 并行数据总线: 512-bit 312.5 MHz ↓时钟计算512-bit × 312.5 MHz 160 Gbps (内部总线带宽)实际有效: 100 Gbps (含编码开销后)步骤 ⑥PCS 编码层 (关键并→并转换)┌─────────────────────────────────────────┐ │ PCS (Physical Coding Sublayer) │ │ │ │ 输入: 512-bit 并行 312.5 MHz │ │ (来自 CMAC 的 MAC 帧数据) │ │ │ │ 操作 1: 64b/66b 编码 │ │ ┌─────────────────────────────────────┐ │ │ │ 每 64-bit 数据块 → 66-bit 编码块 │ │ │ │ 添加 2-bit Sync Header: │ │ │ │ - 10 数据块 (Data Block) │ │ │ │ - 01 控制块 (Control Block) │ │ │ └─────────────────────────────────────┘ │ │ │ │ 操作 2: 扰码 (Scrambling) │ │ 多项式: 1 x^39 x^58 │ │ 目的: 确保 DC 平衡避免长连 0/1 │ │ │ │ 操作 3: 虚拟通道分配 (20 VLs) │ │ 100G 20 个 Virtual Lanes │ │ 每 VL 66-bit 块流 │ │ │ │ 操作 4: Gearbox (20VL → 4PL) │ │ ┌─────────────────────────────────────┐ │ │ │ 20 个虚拟通道 → 4 个物理通道 │ │ │ │ 每 PL 承载 5 个 VL 的交错数据 │ │ │ │ 输出: 4 × 160-bit 并行 161.13 MHz │ │ │ └─────────────────────────────────────┘ │ └─────────────────────────────────────────┘ ↓ 4 × 160-bit 并行总线 161.1328125 MHz ↓Gearbox 详细参数值输入20 VLs × 66-bit 644.53 MHz (等效)输出4 PLs × 160-bit 161.13 MHz转换比(20 × 66) / (4 × 160) 1320 / 640 2.0625实际实现块交错 缓冲对齐步骤 ⑦PMA 层 (关键并→串转换)┌─────────────────────────────────────────┐ │ PMA (Physical Medium Attachment) │ │ │ │ 输入: 160-bit 并行 161.13 MHz │ │ (每通道独立处理) │ │ │ │ 并→串转换 (SerDes): │ │ ┌─────────────────────────────────────┐ │ │ │ 160-bit 并行数据 │ │ │ │ ↓ │ │ │ │ 并串转换器 (Serializer) │ │ │ │ - 160:1 多路复用 │ │ │ │ - 时钟: 161.13 MHz × 160 │ │ │ │ 25.78125 GHz │ │ │ │ ↓ │ │ │ │ 1-bit 串行数据流 │ │ │ │ 速率: 25.78125 Gbps │ │ │ │ UI 38.788 ps │ │ │ └─────────────────────────────────────┘ │ │ │ │ 输出: 1-bit 串行差分信号 (txp/txn) │ └─────────────────────────────────────────┘ ↓ 4 × 1-bit 串行差分信号 每通道 25.78125 Gbps ↓SerDes 核心160:1 串行器使用高速移位寄存器 多相时钟输出经过 TX 预加重 (Pre-emphasis) 补偿信道损耗步骤 ⑧GTY 驱动 QSFP28┌─────────────────────────────────────────┐ │ GTY 收发器 (4 通道) │ │ │ │ CH0 (X0Y4): Lane 0 差分对 (txp0/txn0) │ │ CH1 (X0Y5): Lane 1 差分对 (txp1/txn1) │ │ CH2 (X0Y6): Lane 2 差分对 (txp2/txn2) │ │ CH3 (X0Y7): Lane 3 差分对 (txp3/txn3) │ │ │ │ TX 驱动器: │ │ - 差分摆幅: 800-1200 mV │ │ - 预加重: 补偿 PCB 走线高频损耗 │ │ - 4 通道由 QPLL 同步驱动 │ │ │ │ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ │ │ │ │ QSFP28 光模块: │ │ - 4 对差分电信号 → 4 路光调制器 │ │ - 每路 25.78125 Gbps NRZ 光信号 │ │ - 总输出: 100 Gbps 光信号 │ └─────────────────────────────────────────┘ ↓ 4×25G 光信号 → 单模/多模光纤 ↓三、光纤链路┌─────────────────────────────────────────┐ │ 光纤链路 │ │ │ │ 光信号参数: │ │ - 调制方式: NRZ (Non-Return-to-Zero) │ │ - 每通道: 25.78125 Gbps │ │ - 4 通道并行传输 │ │ - 波长: 850nm (多模) / 1310nm (单模) │ │ │ │ 光纤类型: │ │ - OM3/OM4 多模: 最长 100m │ │ - OS2 单模: 最长 10km (LR4) │ │ │ │ 传输时间: │ │ - 100m 光纤: ~0.5 μs (光在光纤中 │ │ 传播速度 ≈ 5 ns/m) │ │ - 可忽略不计 │ └─────────────────────────────────────────┘ ↓ 4×25G 光信号 ↓四、接收端 RFSoC-4x2 详细数据流步骤 ⑧’QSFP28 → GTY 接收┌─────────────────────────────────────────┐ │ QSFP28 光模块 (接收端) │ │ │ │ - 4 路光电探测器 (PIN/APD) │ │ - 每路 25.78125 Gbps 光 → 电转换 │ │ - 输出: 4 对差分电信号 (rxp/rxn) │ │ │ │ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ │ │ │ │ GTY 接收器 (4 通道): │ │ CH0 (X0Y4): Lane 0 差分对 (rxp0/rxn0) │ │ CH1 (X0Y5): Lane 1 差分对 (rxp1/rxn1) │ │ CH2 (X0Y6): Lane 2 差分对 (rxp2/rxn2) │ │ CH3 (X0Y7): Lane 3 差分对 (rxp3/rxn3) │ │ │ │ RX 模拟前端: │ │ - CTLE (Continuous Time Linear Eq) │ │ - DFE (Decision Feedback Equalizer) │ │ - 补偿信道损耗和码间干扰 (ISI) │ └─────────────────────────────────────────┘ ↓ 4 × 1-bit 串行差分信号 25.78125 Gbps ↓步骤 ⑦’PMA 层 (关键串→并转换)┌─────────────────────────────────────────┐ │ PMA (Physical Medium Attachment) │ │ │ │ 输入: 1-bit 串行差分信号 25.78125 Gbps│ │ │ │ 串→并转换 (CDR Deserializer): │ │ ┌─────────────────────────────────────┐ │ │ │ 1-bit 串行数据流 │ │ │ │ ↓ │ │ │ │ CDR (Clock Data Recovery) │ │ │ │ - 从数据流中提取时钟 │ │ │ │ - 无需独立时钟线! │ │ │ │ - 使用 PLL 相位插值器 │ │ │ │ ↓ │ │ │ │ 串并转换器 (Deserializer) │ │ │ │ - 1:160 解复用 │ │ │ │ - 输出: 160-bit 并行 161.13 MHz │ │ │ │ ↓ │ │ │ │ 弹性缓冲 (Elastic Buffer) │ │ │ │ - 补偿收发端时钟频偏 │ │ │ │ - 典型深度: 64~128 字 │ │ │ └─────────────────────────────────────┘ │ │ │ │ 输出: 160-bit 并行 161.13 MHz │ │ (每通道独立) │ └─────────────────────────────────────────┘ ↓ 4 × 160-bit 并行总线 161.13 MHz ↓CDR 关键从 25.78125 Gbps 的 NRZ 数据流中恢复 25.78125 GHz 时钟使用 Bang-Bang PLL 或 Mueller-Muller 算法锁定时间: 通常 1 ms步骤 ⑥’PCS 解码层 (关键并→并转换)┌─────────────────────────────────────────┐ │ PCS (Physical Coding Sublayer) │ │ │ │ 输入: 4 × 160-bit 并行 161.13 MHz │ │ │ │ 操作 1: Gearbox 逆变换 (4PL → 20VL) │ │ ┌─────────────────────────────────────┐ │ │ │ 4 个物理通道 → 20 个虚拟通道 │ │ │ │ 解交错恢复原始 VL 顺序 │ │ │ │ 输出: 20 VLs × 66-bit │ │ │ └─────────────────────────────────────┘ │ │ │ │ 操作 2: 去扰 (Descrambling) │ │ 多项式: 1 x^39 x^58 (与发送端同步) │ │ │ │ 操作 3: 64b/66b 解码 │ │ ┌─────────────────────────────────────┐ │ │ │ 检查 2-bit Sync Header: │ │ │ │ - 10 有效数据块 │ │ │ │ - 01 控制块 (对齐标记等) │ │ │ │ - 00/11 错误 (Sync Header Viol) │ │ │ │ 提取 64-bit 数据 → 512-bit 总线 │ │ │ └─────────────────────────────────────┘ │ │ │ │ 操作 4: BIP-8 误码检测 │ │ 每 VL 独立计算 BIP-8 │ │ 与发送端插入的值比对 │ │ 不匹配 → BIP-8 Error Counter │ │ │ │ 操作 5: 通道对齐 (Lane Deskew) │ │ 使用 Alignment Marker (AM) │ │ 补偿 4 通道间的传播延迟差 │ │ 典型 skew 容限: ± 几个 UI │ │ │ │ 输出: 512-bit 并行 312.5 MHz │ └─────────────────────────────────────────┘ ↓ 512-bit 并行总线 312.5 MHz ↓步骤 ⑤’CMAC US (MAC 层校验)┌─────────────────────────────────────────┐ │ CMAC US (100G Ethernet 硬核) │ │ │ │ 输入: 512-bit 数据总线 312.5 MHz │ │ │ │ MAC 层操作: │ │ 1. 去除 Preamble (7B) SFD (1B) │ │ 2. FCS (CRC32) 校验 │ │ - 计算接收数据的 CRC │ │ - 与帧尾 FCS 字段比对 │ │ - 不匹配 → FCS Error, 丢弃帧 │ │ 3. 去除 FCS (4B) │ │ 4. 去除 IPG (Inter-Packet Gap) │ │ │ │ 输出: 纯 Ethernet Payload │ │ (即 RoCEv2 包: Eth IP UDP RDMA) │ └─────────────────────────────────────────┘ ↓ 512-bit 并行总线 312.5 MHz ↓步骤 ④’RoCEv2 协议栈解封装┌─────────────────────────────────────────┐ │ RoCEv2 协议栈解封装 │ │ │ │ 1. Ethernet Header 解析: │ │ - DMAC 匹配本机 MAC? │ │ - VLAN Tag 处理 │ │ │ │ 2. IP Header 解析: │ │ - 目的 IP 匹配? │ │ - Header Checksum 校验 │ │ - ECN 字段提取 (拥塞通知) │ │ │ │ 3. UDP Header 解析: │ │ - 目的 Port 4791? (RoCEv2) │ │ - UDP Checksum 校验 (可选) │ │ │ │ 输出: RDMA 包 (BTH RETH Payload) │ └─────────────────────────────────────────┘ ↓ 512-bit 并行总线 312.5 MHz ↓步骤 ③’RDMA 引擎解封装┌─────────────────────────────────────────┐ │ RDMA 引擎解封装 │ │ │ │ 1. BTH 解析: │ │ - Opcode: RDMA_WRITE_ONLY? │ │ - PSN (Packet Sequence Number) 校验 │ │ 期望 PSN 上次 1 │ │ 乱序/丢包 → 放入重排序缓冲 │ │ - QPN (Queue Pair Number): 42 │ │ │ │ 2. RETH 解析: │ │ - Virtual Address: 目标内存地址 │ │ - R_Key: 内存区域权限校验 │ │ - DMA Length: 4096 bytes │ │ │ │ 3. Payload 写入 RX Buffer: │ │ - 根据 VA R_Key 翻译物理地址 │ │ - 通过 DMA 写入 Host 内存 │ │ - 每包 4KB Payload │ │ │ │ 4. 生成 ACK (可选): │ │ - 如果是 RDMA_WRITE_WITH_IMM │ │ - 发送 ACK 包回发送端 │ └─────────────────────────────────────────┘ ↓ 512-bit 并行总线 ~200 MHz (DMA 内部) ↓步骤 ②’DMA → Host 内存┌─────────────────────────────────────────┐ │ DMA Engine (接收方向) │ │ │ │ - 按 SGE 列表 Gather 数据 │ │ - 通过 PCIe TLP (Memory Write) │ │ 写入 Host DDR │ │ - 每完成一个 SGE更新 CQ │ │ │ │ 数据重组: │ │ - 256 个 4KB 块 → 按 PSN 顺序重组 │ │ - 写入连续的 1MB 内存区域 │ │ │ │ 完成通知: │ │ - 写入 CQ Entry (Completion Queue Entry) │ │ - 触发 MSI-X 中断通知 CPU │ └─────────────────────────────────────────┘ ↓ PCIe Gen3 x8 TLP ↓步骤 ①’Host CPU 完成┌─────────────────────────────────────────┐ │ Host CPU (接收端) │ │ │ │ 1. 收到 MSI-X 中断 │ │ 2. 调用 ibv_poll_cq() │ │ 3. 读取 CQ Entry: │ │ - WC (Work Completion) 状态 SUCCESS │ │ - 字节数 1,048,576 (1MB) │ │ - QP #42 │ │ 4. 通知应用层: 1MB 数据传输完成 │ │ │ │ 端到端时间: ~100-120 μs │ │ (含协议开销、DMA 延迟、中断处理) │ └─────────────────────────────────────────┘五、串并转换/并串转换总结位置转换类型输入输出关键组件发送端 PCS并→并512-bit 312.5 MHz4×160-bit 161.13 MHzGearbox (20VL→4PL)发送端 PMA并→串160-bit 161.13 MHz1-bit 25.78125 GbpsSerDes (160:1)接收端 PMA串→并1-bit 25.78125 Gbps160-bit 161.13 MHzCDR Deserializer (1:160)接收端 PCS并→并4×160-bit 161.13 MHz512-bit 312.5 MHzGearbox (4PL→20VL)六、关键时序参数参数发送端接收端内部总线时钟312.5 MHz312.5 MHzPCS 接口时钟161.13 MHz161.13 MHzSerDes 线速率25.78125 Gbps25.78125 GbpsUI38.788 ps38.788 ps每通道有效载荷25 Gbps (64b/66b 后)25 Gbps总有效带宽100 Gbps100 Gbps七、数据形态变化全景1MB 数据形态变化: Host 内存: [1MB 连续字节流] ↓ PCIe TLP: [256 × 4KB TLP Read] ↓ FPGA TX Buffer: [256 × 4KB 并行块 512-bit] ↓ RDMA 封装: [256 × (BTHRETH4KB Payload)] ↓ RoCEv2 封装: [256 × (EthIPUDPRDMA)] ↓ CMAC MAC: [256 × Ethernet Frame (4178B)] ↓ PCS 64b/66b: [256 × 66-bit 块流] ↓ PCS Gearbox: [4 通道 × 160-bit 并行 161MHz] ↓ PMA SerDes: [4 通道 × 1-bit 串行 25.78Gbps] ↓ GTY 驱动: [4 对差分电信号] ↓ QSFP28: [4 路光信号 25.78G] ↓ 光纤: [4 路光信号传播] ↓ QSFP28 (接收): [4 路光 → 4 对差分电信号] ↓ GTY 接收: [4 通道 × 1-bit 串行 25.78Gbps] ↓ PMA CDRDes: [4 通道 × 160-bit 并行 161MHz] ↓ PCS Gearbox: [20VL × 66-bit → 512-bit 312.5MHz] ↓ CMAC MAC: [256 × Ethernet Frame] ↓ RoCEv2 解封: [256 × (EthIPUDPRDMA)] ↓ RDMA 解封: [256 × (BTHRETH4KB)] ↓ DMA 写回: [256 × 4KB TLP Write] ↓ Host 内存: [1MB 连续字节流] ← 完成!