单盘突破 7 GB/s:基于 FPGA 的 PCIe 4.0 NVMe 高速读写系统
摘要在此前的系列工作中我们先后实现了基于 Zynq PS/PL 协同的 NVMe Host、FPGA 纯逻辑 NVMe Host以及双盘 RAID0 和 exFAT 文件系统并在 PCIe 3.0 平台上实现了单盘约 3 GB/s、双盘约 6 GB/s 的读写性能。随着实际项目对存储带宽的要求不断提高我们重新启动了 PCIe 4.0 NVMe Host 的开发和性能优化。本文介绍 PCIe 4.0 NVMe Host 在两个 AMD/Xilinx FPGA 平台上的实现一个是采用 Virtex UltraScale HBM 器件的 VCU128 平台分别使用 DDR4 和 HBM 作为本地数据缓冲另一个是采用 Versal 器件的 VMK180 平台使用LPDDR4 构建数据通路。针对不同平台的 PCIe IP、存储器接口和时钟体系我们重新设计并优化了 NVMe 命令控制、数据缓存、跨时钟域传输以及 AXI outstanding 事务。本文所有性能数据均为单块NVMe SSD通过一条PCIe 4.0 x4链路获得不是多盘并行或RAID聚合带宽。测试结果表明系统的 NVMe SSD顺序写入速度达到约 7.2 GB/s顺序读取速度达到约 7.0 GB/s。在稳定的大块数据传输阶段PCIe 侧数据通路能够保持连续传输性能已经接近 PCIe 4.0 x4 链路的实际可用带宽上限。1. 从 PCIe 3.0 到 PCIe 4.0距离上一篇关于 FPGA NVMe 高速实时存储系统的文章已经过去了两年多。两年前我们也曾尝试把 NVMe Host 迁移到 PCIe 4.0 平台。最初的工程能够完成基本的 NVMe 读写但性能并不理想。当时没有足够时间逐项分析瓶颈项目因此暂时搁置。过去两年我们陆续为军工、科研院所、高校和上市公司完成了十余个定制化项目主要精力一直投入在这些项目的开发、调试和交付中始终没有完整的时间窗口继续推进 PCIe 4.0 NVMe 工程。这个过程也让我们更加清楚地认识到做出一个能够运行的原型 IP只是工程工作的开始。从原型进入用户的实际系统还需要解决板级信号完整性、器件和平台适配、复位与跨时钟域、总线背压、异常恢复、长时间稳定运行以及各种边界条件。许多在实验室短时间测试中不会暴露的问题只有进入真实项目后才会出现。今年暑期恰好出现了一个时间窗口我们重新启动 PCIe 4.0 工程。目标不再只是让 SSD 正确完成读写而是尽可能发挥 PCIe 4.0 x4 和高性能 NVMe SSD 的实际带宽。2. 第一个瓶颈不是 RTL而是板卡复盘早期 PCIe 4.0 工程后我们首先发现的问题来自硬件。原有 NVMe FMC 子卡可强行安装到 FMC 底座上但 FMC 接口本身无法为当前高速链路提供足够的带宽和信号完整性保证。也就是说在开始优化 NVMe Host 和 FPGA 数据通路以前板卡已经构成了第一个瓶颈。为此我们重新设计了一块 FMC 接口的 NVMe 子卡使高速串行链路、参考时钟、复位以及电源设计能够适配 PCIe 4.0。高速板卡的成本也远超最初估算仅制板费用就接近五千元加上设计、BOM 和贴装五块板卡总投入约八千元。虽然这个价格远高于预期但为了追求极致的速度和性能我们最终还是下定决心投入并完成本次测试。因为如果物理链路本身不可靠后续任何 RTL 优化都无法得到可信的性能结果。下图为本次重新设计的 FMC 接口的 NVMe 子卡提供两个 M.2 NVMe SSD 接口。拿到 FMC 接口的 NVMe 子卡后我们首先对四条 PCIe 高速通道进行了眼图扫描每条通道的链路速率为16.0 GT/s。如下图所示四条通道均形成了清晰的眼图开放区域Open UI 分别为 77.78%、66.67%、66.67% 和 66.67%说明重新设计的子卡能够为 PCIe 4.0 链路提供稳定的物理连接。眼图测试通过后我们进一步检查了 SSD 的实际链路协商状态。下图中链路已经进入正常工作状态cfg_current_speed为3对应 PCIe Gen4cfg_negotiated_width为2对应 x4 链路宽度也就是最终成功协商到 PCIe 4.0 x4。眼图和链路协商结果说明FMC 接口的 NVMe 子卡已经不再构成 PCIe 4.0 数据通路的硬件瓶颈也为后续性能测试提供了可靠的物理链路基础。本次我们共制作了五块FMC接口的NVMe子卡经过实际测试板卡性能能够满足PCIe 4.0 x4高速传输需求。我们自用不需要这么多如果业界的朋友有相关板卡需求可以与我们联系。3. 两套测试平台本次工作使用了两块架构差异较大的评估板平台FPGA 器件本地存储主要验证目标VCU128Virtex UltraScale HBMDDR4、HBM验证 UltraScale PCIe 4.0 近线速数据通路VMK180Versal 系列器件LPDDR4验证 NVMe Host 在 Versal 架构下的迁移两套平台使用相同的 NVMe Host 基本思想但底层 PCIe 接口、存储器、时钟复位结构和数据调度方式并不相同。因此本次移植不是简单地更换 FPGA 型号或重新生成一遍工程而是分别针对两个平台重新搭建数据通路。4. VCU128DDR4/HBM 与 XDMA 数据通路VCU128 平台通过我们设计的 FMC 接口的 NVMe 子卡连接 SSD。下图为安装该子卡后的 VCU128 测试平台。下图为 VCU128 平台测试使用的两块 Crucial T710 4TB SSD。VCU128 内部集成 HBM。根据 AMD 公开资料Virtex UltraScale HBM 系列器件的集成 HBM 带宽最高可达约 460 GB/s。如此高的片上存储带宽为高速缓存和多通道并行访问提供了很大的设计空间。我们此前没有在实际 NVMe 项目中使用过 HBM因此也很好奇面对如此高的理论带宽当本地存储器从 DDR4 换成 HBM 后NVMe 的实际传输性能究竟能否得到进一步提升4.1 HBM 并不是自动获得高性能HBM 具有多个独立通道。根据 AMD 的 HBM Controller 产品手册HBM 的每个 AXI3 用户端口最高支持 450 MHz这里的 450 MHz 指用户逻辑侧 AXI 端口时钟HBM 内部 Memory Clock 最高为 900 MHz。不过接口工作频率并不是越高越好。我们首先根据实际启用的 HBM 通道数、接口位宽以及 NVMe 数据通路的总带宽需求进行理论计算再结合布局布线后的时序收敛结果最终将 HBM AXI 端口频率设置为 300 MHz。本工程使用一个 HBM stack共包含 16 个 256 bit AXI 接口。如果运行在最高 450 MHz一个 stack 的接口侧理论聚合带宽为 230.4 GB/s在本工程采用的 300 MHz 下理论聚合带宽为HBM 理论带宽 16 × 256 bit × 300 MHz / 8 153.6 GB/s带宽预算不能只考虑一块 SSD。多盘系统同时工作时SSD 读盘会占用 HBM 写入带宽SSD 写盘会占用 HBM 读取带宽如果读盘和写盘同时进行两类流量还会共同占用 HBM 通道和调度资源。因此最保守的带宽需求应按所有并发数据流之和计算HBM 带宽需求 读盘数量 × 单盘读盘带宽 写盘数量 × 单盘写盘带宽按照单盘约 7 GB/s 估算即使扩展到多盘并行并考虑读写同时进行一个 HBM stack 在 300 MHz 下的理论带宽仍有较大余量。继续提高 HBM 频率不会提升单路 PCIe 4.0 x4 的上限反而会增加时序收敛难度。因此300 MHz 是综合理论带宽、并发扩展需求和工程时序后确定的取值。在这一带宽预算下系统瓶颈主要转移到 PCIe 链路的有效载荷带宽、AXI outstanding 能力、FIFO 流量控制、地址与数据通道衔接以及 NVMe 命令和完成队列处理效率。换句话说HBM 提供了充足的带宽上限但它不会自动消除 PCIe 和 AXI 数据路径中的气泡。真正决定系统速度的是从 HBM 到 PCIe 的整条链路能否让多个并发数据流持续推进。4.2 针对 HBM 并行特性的架构优化HBM 的高带宽并不是因为单个通道更快恰恰相反在本工程的接口参数下单个 HBM 通道的理论带宽低于 DDR。单个 HBM AXI 端口为 256 bit在 300 MHz 下的理论带宽为256 × 300 MHz / 8 9.6 GB/s作为对比512 bit、300 MHz 的 DDR4 接口理论带宽为19.2 GB/s。HBM 真正的优势来自多个独立通道同时工作一个 stack 的 16 个通道并行后理论聚合带宽才能达到 153.6 GB/s。因此我们没有简单地把 HBM 当作一块更快、更大的 DDR 使用而是围绕其多通道并行能力重新组织数据缓存和访问调度。系统将不同数据区间分配到多个 HBM 访问通道各通道可以独立发起事务并通过通道侧缓存和统一的数据调度模块与 PCIe 数据通路衔接。这种架构可以让多个 HBM 访问任务并行推进减少单个通道访问延迟对整体数据流的影响。当某个通道正在等待响应时其他通道仍可继续完成数据读取或写回调度模块再将各通道的数据按 NVMe 传输顺序进行汇聚或分发。通过这种方式HBM 的优势不再只是较高的理论带宽而是能够利用通道级并行性持续为 PCIe 侧提供数据或接收写回数据。因此本次优化的目的不是把 HBM 的全部理论带宽跑满而是利用多通道并行访问降低存储侧等待并为后续多盘并行及读写同时工作预留带宽使本地缓存不再成为 PCIe 连续传输的瓶颈。4.3 SSD 写盘本地存储到 SSD写盘时FPGA 从 DDR4 或 HBM 中读取待存储数据并通过 PCIe 4.0 数据通路连续写入 NVMe SSD。为了充分发挥 PCIe 4.0 和 SSD 的性能我们对数据缓存和传输调度进行了优化尽可能减少数据传输过程中的等待。下图展示了写盘稳定传输阶段的波形。判断数据事务是否连续主要观察 AXI R 通道在稳定传输区间内RVALID持续保持有效RREADY允许接收时每个时钟都完成一次数据握手前一个突发传输的RLAST结束后后一个突发的首个数据拍紧接着到来没有出现RVALID拉低的空闲周期。这说明数据事务已经连续衔接整个数据通路保持稳定工作。从图中可以看到每次 AR 请求的ARLEN15对应 16 个 256 bit 数据拍即每次读取 512 Byte。FPGA 数据通路可以在连续 16 个时钟周期内完成一个 burst 的全部数据传输说明本地存储和返回数据通路已经能够达到每拍传输一个数据的效率。但是相邻两次 AR 握手大约间隔 17 个时钟周期有时还会更长。也就是说FPGA 只需要 16 拍就能完成一个 burst而 XDMA/PCIe Bridge 提供下一条 AR 请求的间隔却大于 16 拍。本地通路处理数据的速度快于上游产生请求的速度因此长期平均吞吐最终受 AR 请求节奏限制。在 250 MHz 时钟下按照约 17 拍一次 AR 请求计算对应的理论数据上限约为512 Byte × 250 MHz / 17 7.53 GB/s经过缓存、预取和 outstanding 请求调度后已经提前进入队列的多个请求可以让 R 通道数据在当前波形窗口内连续衔接数据返回阶段没有额外气泡。但缓存只能隐藏短时间的请求间隔不能改变 AR 请求的长期平均产生速率。因此此时限制写盘速度的主要因素已经不是 DDR4/HBM 的供数能力而是 XDMA/PCIe Bridge 发起 AR 请求的节奏。实际约 7.1 GB/s 的结果也已经比较接近这一接口节奏所能达到的上限。下面给出 VCU128 平台在 NVMe SSD 写盘稳定传输阶段的完整波形上图展示的是VCU128平台的写盘过程。可以看到在命令进入稳定数据阶段后FPGA内部数据通路持续供数没有因本地存储或缓存调度产生新的传输空隙最终速度主要受PCIe Bridge请求发起和SSD响应节奏限制。4.4 SSD 读盘SSD 到本地存储读盘时数据方向与写盘相反SSD 中的数据通过 PCIe 进入 FPGA再写入 DDR4 或 HBM。我们对读盘方向的数据缓存和传输衔接进行了优化使数据能够持续进入本地存储器尽量减少传输过程中的等待。读盘方向也具有相同特点SSD 数据进入 FPGA 后本地写回通路能够连续接收并写入 DDR4/HBM没有额外插入气泡。此时 HBM 或 DDR4 的写入带宽已经不是瓶颈实测读盘性能已经达到 XDMA/PCIe Bridge 在当前配置下的极限带宽。4.5 VCU128 测速方法与结果VCU128 平台的读写测试均传输 256 MiB 数据。测试时使用 250 MHz 的64位计数器连续计数以en作为一条 NVMe 命令的启动时刻以done作为命令完成时刻。分别读取en和done对应的计数器值两者之差就是整条命令所消耗的时钟拍数。该方法统计的是完整 NVMe 命令时间而不是只截取中间的数据传输波形因此包含命令启动、SSD 执行、数据传输和完成响应的全部开销。VCU128读盘测试的起点和终点如下。起点计数器值为0x623E725F9A终点计数器值为0x623F029A96两者相减得到9,452,284拍。这里需要区分MiB和GB测试数据量按二进制容量计算256 MiB 256 × 1024 × 1024 268435456 Byte最终带宽使用十进制单位GB/s1 GB 10^9 Byte因此256 MiB对应0.268435456 GB。读盘速度计算如下计数拍数 0x623F029A96 - 0x623E725F9A 9452284 传输时间 9452284 / 250000000 0.037809136 s 传输数据量 256 × 1024 × 1024 / 1000000000 0.268435456 GB 读盘速度 0.268435456 / 0.037809136 7.099751128933 GB/s ≈ 7.10 GB/sVCU128写盘测试采用相同方法。起点计数器值为0x268AC5D084终点计数器值为0x268B56BEDC两者相减得到9,498,200拍。写盘速度计算如下计数拍数 0x268B56BEDC - 0x268AC5D084 9498200 传输时间 9498200 / 250000000 0.0379928 s 传输数据量 256 × 1024 × 1024 / 1000000000 0.268435456 GB 写盘速度 0.268435456 / 0.0379928 7.065429660357 GB/s ≈ 7.07 GB/s按照包含命令启动、SSD 执行、数据传输和完成响应在内的完整命令时间统计VCU128 平台实测读盘速度约为7.10 GB/s写盘速度约为7.07 GB/s两个方向均稳定突破 7 GB/s。这不是只截取局部连续数据波形得到的瞬时带宽而是完成一次 256 MiB 传输后的实际结果。4.6 资源与实现结果从实现结果可以看到本次工程只使用了 VCU128 上的一个 HBM stack。经过 Vivado 布局布线后与 HBM 数据通路相关的主要逻辑资源集中分布在该 stack 附近。当前器件的另一组 HBM 资源以及部分逻辑资源仍有余量因此现有架构并不局限于单盘应用如果后续需要扩展多盘可以继续利用更多 HBM 通道和剩余资源构建并行数据通路。5. VMK180Versal 平台适配VMK180 平台同样通过 FMC 接口的 NVMe 子卡连接 SSD。下图为安装 Samsung 980 PRO SSD 后的 VMK180 测试平台。下图为 VMK180 平台更换 Crucial T710 SSD 后的测试环境。最初我们以为Versal 平台只需要将 UltraScale 版本的 NVMe IP 重新封装再替换器件即可完成移植。实际开始后才发现Versal 的 PCIe、存储器和时钟复位体系都发生了明显变化原有数据通路不能直接照搬必须围绕新的 PCIe 接口和 LPDDR4 重新搭建系统。这次迁移保留了 NVMe Host 原有的基本功能和对外使用方式主要针对 Versal 平台重新完成底层接口与数据通路的适配其中变化最大的是数据面原有数据通路需要适应 Versal 平台的 PCIe 接口和事务行为LPDDR4 的访问粒度、时钟及响应延迟也与 VCU128 的 DDR4/HBM 不同。5.1 LPDDR4 连续读取下图是 VMK180 平台从 LPDDR4 读取数据时的 ILA 波形。R 通道的RVALID和RREADY在稳定传输区间持续有效数据拍连续输出说明 LPDDR4 数据源能够为后级 PCIe/NVMe 通路持续提供数据。图中相邻 AR 握手同样大约每 17 个时钟周期出现一次每个请求传输 16 个 256 bit 数据拍。R 通道的RVALID和RREADY持续有效说明 LPDDR4 侧已经能够连续输出数据没有在数据阶段产生气泡。因此继续提高本地存储带宽不会直接提高最终速度系统性能主要受 PCIe 接口请求节奏限制。5.2 NVMe 写盘下面两张图对应VMK180平台的写盘测速。VMK180同样使用256 MiB作为单次测试数据量并以250 MHz计数器记录完整命令耗时。左图记录en启动时刻右图记录done完成时刻使用终点计数值减去起点计数值再按照“数据量÷传输时间”的方式计算写盘速度。上面两张波形分别标记了写盘命令的启动和完成时刻用于统计整条NVMe命令的总周期数。结合前面的LPDDR4连续读取波形可以看出本地数据读取阶段已经保持连续最终耗时包含PCIe接口请求节奏、SSD执行以及NVMe命令处理开销。截图中的起点计数器值为0x4D6D253E39终点计数器值为0x4D6DB5F71B两者相减得到9,484,514拍。按照250 MHz计数时钟和256 MiB传输数据量计算写盘拍数 0x4D6DB5F71B - 0x4D6D253E39 9,484,514拍 写盘时间 9,484,514 / 250,000,000 0.037938056 s 写盘速度 0.268435456 / 0.037938056 7.075624960857 GB/s ≈ 7.076 GB/s需要说明的是上面两张截图对应的是一次约7.076 GB/s的完整命令测试。在VMK180平台的多次实际测试中我们测得的最高写盘速度达到7.2 GB/s但当时没有保留该最高值对应的起止波形截图因此这里将截图可复算结果和最高测试结果分别说明。5.3 NVMe 读盘VMK180读盘采用完全相同的测试方法传输256 MiB数据记录en与done两时刻的计数器值以差值作为命令总拍数再除以250 MHz得到传输时间。这样可以保证两块平台以及读盘、写盘结果采用一致的统计口径。上面两张波形以同样方式记录读盘命令从启动到完成的周期数。稳定传输阶段的本地数据通路没有额外气泡最终速度主要由PCIe接口的数据到达节奏和SSD的实际响应能力决定。在 Versal 平台重新搭建数据通路的过程也说明一个可移植的 NVMe Host 不应把协议控制与某一种 PCIe IP 或存储器控制器紧密耦合。比较合理的设计方式是将系统划分为三层与平台无关的 NVMe 命令层面向数据流的缓存与调度层与 PCIe 接口、DDR、HBM 或 LPDDR 相关的平台适配层。这种分层不能完全消除平台迁移工作但能够把改动范围限制在数据接口和底层适配模块内避免重新实现完整的 NVMe 协议控制。6. 性能测试6.1 测试条件为了便于理解和比较测试结果下面汇总本次测试使用的 FPGA 平台、PCIe 链路、SSD、本地存储器及测试数据量等条件。测试项VCU128 DDR4VCU128 HBMVMK180 LPDDR4FPGA 平台VCU128VCU128VMK180PCIe IPXDMAXDMA平台 PCIe 接口链路Gen4 x4Gen4 x4Gen4 x4SSD 型号/容量Crucial T710 4 TBCrucial T710 4 TBSamsung 980 PRO 1 TB、Crucial T710 4 TB测试数据量256 MiB256 MiB256 MiB本地存储时钟300MHz300 MHz300 MHz带宽按实际完成的数据量和时钟周期计算bytes NLB × 512 seconds elapsed_cycles / test_clock_hz GB/s bytes / seconds / 1,000,000,0006.2 测试结果本次系统测试得到的最高顺序读取速度约为7.0 GB/sVMK180平台测得的最高顺序写入速度达到7.2 GB/s多次测试的平均写入速度也保持在7 GB/s以上。读写两个方向都达到了7 GB/s级别已经进入高性能PCIe 4.0 NVMe SSD在PC平台上的典型性能区间。本次工作重点优化了写盘数据通路读盘方向没有进行同等程度的专项优化因此读取速度仍有进一步提升空间。不过当前读盘性能已经能够满足实际项目需求继续优化需要投入较多时间因此本阶段没有继续追求更高的读盘数字。不同SSD之间的主控、闪存、固件和缓存策略存在差异同一个NVMe Host IP连接不同SSD时最终速度也会发生变化。多次测试表明我们的IP能够稳定提供7 GB/s以上的写入能力当性能出现差异时瓶颈已经更多地转移到SSD本身而不是FPGA内部数据通路。6.3 7 GB/s的关键让延迟重叠起来PCIe 4.0的单通道传输速率为16.0 GT/s采用128b/130b编码编码效率约为98.46%。扣除编码开销后单通道理论有效带宽约为15.754 Gbit/s即1.969 GB/sPCIe 4.0 x4的理论有效带宽约为单通道有效带宽 16.0 GT/s × 128 / 130 15.754 Gbit/s 1.969 GB/s PCIe 4.0 x4理论有效带宽 1.969 GB/s × 4 7.877 GB/s这里的7.877 GB/s只扣除了128b/130b编码开销尚未扣除事务包头、流控和协议交互等开销因此实际应用层带宽还会略低。进一步结合VCU128写盘波形分析每次传输512 Byte数据XDMA/PCIe Bridge大约每17个250 MHz时钟周期完成一次AR握手对应的接口理论速度约为7.53 GB/s。本文最高不低于7.2 GB/s、平均超过7 GB/s的写入结果已经接近这一接口节奏所能达到的上限。从 PCIe 3.0 的约 3 GB/s 提升到 PCIe 4.0 的 7 GB/s 级别并不是升级链路后性能就会自动翻倍。实际系统中SSD、PCIe 接口、本地存储器和跨时钟 FIFO 均会引入延迟。只要任意一级采用“完成一笔、再启动下一笔”的串行方式链路上就会出现明显空闲。本次优化的核心思想是用并行事务和缓存让不同阶段的延迟相互重叠当前一批数据正在通过 PCIe 传输时提前从本地存储预取下一批数据当前一个 AXI burst 还未完全返回时提前接受后续地址请求使用足够深的 FIFO 隔离 PCIe 与存储器的瞬时速率差使用水位而不是简单的空/满信号决定是否启动下一批事务将 NVMe 命令处理与大数据搬运解耦在满足协议和边界条件的前提下提高 outstanding 数量这里所说的“无气泡”特指稳定的大块数据传输阶段中相邻数据拍或相邻事务能够连续衔接。NVMe 命令启动、完成队列处理以及不同命令之间仍然可能存在控制间隔因此不能把局部波形中的无气泡简单等同于所有场景下的平均带宽。7. 与 PC 和其他 IP 比较评价 FPGA NVMe Host 的性能时首先要区分 FPGA 的 PCIe 角色。本文的 FPGA 工作在 Root Port/Root Complex 一侧NVMe SSD 是 Endpoint不能与 FPGA 模拟 NVMe SSD、由 PC 作为 Root Complex 的 NVMe Target 方案混为一谈。7.1 与 PC 平台对比三星990 PRO的官方最高顺序写入速度为6.9 GB/s。为了更接近实际PC环境我们还整理了多家媒体和用户平台的公开写盘测试并与本文结果进行比较测试来源测试平台顺序写入速度三星官网Samsung 990 PRO官方指标6.900 GB/s天极网PC实测6.965 GB/s太平洋电脑网PC实测7.051 GB/s知乎PC实测6.788 GB/s中关村在线PC实测6.902 GB/sIT168PC实测6.908 GB/s本文FPGA NVMe HostVCU128、VMK180最高不低于7.2 GB/s平均超过7.0 GB/s公开PC测试结果集中在6.7887.051 GB/s本文FPGA平台的最高写入速度不低于7.2 GB/s平均写入速度保持在7 GB/s以上。单纯从顺序写入性能看我们的NVMe Host IP不仅达到高性能PC平台的同一速度等级而且已经超过Samsung 990 PRO的官方写入指标。考虑到不同SSD会直接影响最终结果这也说明IP数据通路已经具备充分的性能余量当前系统更容易受到SSD自身写入能力的限制。7.2 Design Gateway NVMe-IP与AMD PCIe Gen4 Hard IPDesign Gateway是一家AMD/Xilinx官方认可的第三方IP提供商。公司给出了其NVME Host IP在AMD VCK190上的测试结果。VCK190同样属于Versal平台与本文VMK180方案更为接近因此这组数据具有较强的参考意义。该方案使用Addlink S95 2 TB SSD写缓冲区为256 KB读缓冲区为1 MB从SSD读取速度为6,396 MB/s向SSD写入速度为5,696 MB/s。对比项目本文FPGA NVMe HostDesign Gateway VCK190方案FPGA平台VCU128、VMK180AMD VCK190PCIe接口AMD PCIe Gen4 Hard IPAMD PCIe Gen4 Hard IP从SSD读取约7.0 GB/s6.396 GB/s向SSD写入最高不低于7.2 GB/s5.696 GB/s虽然两组测试使用的SSD和缓冲区条件不同不能视为完全同条件测试但本文方案在读取和写入两个方向上的性能都更好。尤其是写盘方向本IP测试结果超过7 GB/s而VCK190的结果为5.696 GB/s。详细资料可参见Design Gateway NVMe-IP Introduction for Xilinx。Design Gateway另有一项基于ZCU102和PCIe Gen4 Soft IP的NVMeG4-IP方案其标称写入速度约为7.0 GB/s反而明显高于前述Hard IP方案的5.696 GB/s这一差异是否来自SSD、缓冲区或其他测试条件尚不明确即便如此其写入速度仍低于本IP最高不低于7.2 GB/s的结果。总结综合PC实测、VCK190 Hard IP方案和ZCU102 Soft IP方案来看我们的NVMe Host IP在写盘方向已经进入国际主流IP的第一梯队单纯从顺序写入性能来看已经位列目前公开结果中的最高水平。当前数据通路能够稳定提供7 GB/s以上的写入能力进一步性能差异主要取决于SSD本身及具体测试条件。8. 从原型 IP 到实际项目回顾这两年的十余个定制项目我们最大的体会是IP 的价值不仅在于某一次测试跑出了多高的峰值更在于它能否在不同器件、不同存储器和不同工程环境中稳定工作。从 Zynq PS/PL 协同方案到纯逻辑 NVMe Host从 PCIe 3.0 单盘到双盘 RAID0从裸盘高速写入到 exFAT 文件系统再到本次 VCU128 和 VMK180 上的 PCIe 4.0 实现系统的变化不只是速度数字的提高。我们逐步补齐了命令控制、数据调度、平台适配、异常处理和工程验证中的大量细节。PCIe 4.0 也让系统瓶颈发生了变化。在早期工程中SSD或协议处理速度经常是主要限制当单盘带宽达到 7 GB/s 后板级信号完整性、AXI outstanding、跨时钟 FIFO、水位设置、本地存储访问效率和时序收敛都会成为决定最终性能的关键因素。任何一个环节出现短暂停顿都会直接反映在最终带宽上。9. 总结本文在 VCU128 和 VMK180 两类 FPGA 平台上实现了 PCIe 4.0 NVMe Host并分别验证了 DDR4、HBM 和 LPDDR4 数据通路。面对 UltraScale 与 Versal 在 PCIe IP、存储体系和时钟架构上的差异我们没有简单复制原有工程而是将 NVMe 命令层、数据缓存调度层和平台接口层重新划分使核心设计能够适配不同平台的底层接口。经过对FMC硬件和写盘数据通路的优化系统顺序写入的最高速度不低于7.2 GB/s多次测试的平均速度超过7 GB/s稳定数据阶段实现连续传输。读盘方向虽然没有进行同等程度的专项优化速度仍达到约7.0 GB/s已经能够满足实际项目需求。测试结果说明我们的NVMe Host IP本身已经具备充分的性能能力能够逼近PCIe 4.0 x4的实际有效带宽上限在这一速度等级下最终结果更多受到SSD型号、固件和持续写入能力的影响。需要说明的是7 GB/s对于一个多盘存储系统的总带宽而言并不算特别高我们此前也实现过四块NVMe SSD并行工作从而获得更高的系统聚合带宽。本次结果的意义在于仅使用一块SSD和一条PCIe 4.0 x4链路便实现了7 GB/s级别的读写性能。更高的单盘带宽能够更加充分地利用每个硬件接口在达到相同系统带宽时减少SSD数量和PCIe端口占用将更多高速接口资源留给其他应用同时降低FPGA逻辑资源、缓存和数据通路的消耗并减小时序收敛和系统集成的压力。后续我们还会继续完善长时间全盘测试、不同 SSD 对比、随机访问性能和异常恢复机制并进一步研究多盘并行条件下的 PCIe 4.0 NVMe 存储架构。联系方式如果需要讨论相关技术联系方式如下北京市可线下交流地址北京市海淀区中关村南大街5号北京理工大学。非京可联系Tel138_1060_2873微信同号E-mailliuzhenyubit.edu.cn声明在本文的结尾我们作如下声明本次测试仅作为与对该领域感兴趣的朋友交流之用。由于测试环境受限部分硬盘的速度可能并未达到该盘的最大值测试结果仅代表我们在此次实验中得到的结果不代表硬盘的最优性能。我们仅针对某款型号的某块硬盘基于 FPGA 平台使用自己的测试程序进行了统一、无差别的测试并得到了文中的测试结果。我们仅对所采用的测试方法及所使用的硬盘负责保证不存在虚假或伪造的结果但不对市场上所有同型号或类似产品的性能作出推断或推论。本文数据公开发布仅供大家参考。参考资料三星 990 PRO 官方产品页面AMD Virtex UltraScale HBM 产品简介AMD AXI High Bandwidth Memory Controller PG276PerformanceDesign Gateway NVMeG4-IP 参考设计Design Gateway NVMe-IP Introduction for Xilinx基于 FPGA 的 40Gbps 双路 NVMe 高速实时存储系统FPGA 实现高带宽 NVMe SSD 读写——纯逻辑实现基于 FPGA 纯逻辑的双盘 NVMe RAID0 存储系统带 exFAT 文件系统的 FPGA NVMe 高速读写系统实现