NVMe HC IP 需求
目前常用的SATA控制器IP无法满足 GBps 以上高速存储性能方面的指标要求。NVMe控制器能够加速NVMe指令管理过程,大幅提高数据的读写传输速率,有效降低传输延迟。采用NVMe控制器成为目前高速存储的迫切需求。
目前,NVMe控制器输入输出端口主要基于AMBA AXI4总线接口协议,使其能够与FPGA整体系统设计中的其余模块高效互连,提高开发效率并增强可移植性。
通过分析NVMe指令控制流程中数据的交互需求,NVMe控制器输入输出端口可同时使用AXI、AXI-Lite以及AXI-Stream三种总线接口,以针对不同场景合理使用三种总线,充分利用各自的特性,实现性能和资源消耗的平衡。
除上述要求之外,所开发的NVMe控制器具有以下几个主要特点:
(1)SSD的管理控制符合 NVMe 1.3d 协议规范;
(2)实现读、写、识别以及刷新等在内的多种NVMe指令;
(3)支持多队列的并行管理;
(4)支持Round-Robin仲裁机制;
(5)采用完全可综合的Verilog代码实现;
一种应用NVMe HC IP 的系统设计
为便于说明本NVMeHC IP 应用,给出如图1所示系统整体设计方案,但它不局限于zynq系列,实际上也可用于支持AXI4的K及V系列。图1主要包括Zynq处理器系统(Processing System,PS)、NVMe控制器、DMA/Bridge Subsystem for PCI Express IP核(XDMA)、用户逻辑以及AXI Interconnect等模块。其中,为了简化框图而省略模块间的AXI Interconnect总线互连模块。
Zynq处理器系统模块中包含的硬核ARM Cortex-A53应用CPU将负责执行裸机应用程序、配置NVMe控制器寄存器等工作,并且本课题所使用的DDR存储器件也包含在处理器系统中。
1)NVMeHC IP作为整体系统中的核心模块,实现寄存器组定义、指令组装、数据流转换、指令组装、多队列管理、Round-Robin仲裁管理、门铃信息控制、指令发送和完成信息接收以及错误检测等关键功能。将原本由CPU执行的软件驱动程序迁移至NVMe控制器中,从而完全通过硬件逻辑的方式实现对外接SSD进行读写等指令操作的控制流程,提升传输性能。
2)XDMA IP核实现基于PCIe总线的链路连接,并根据性能指标要求配置链路速率参数为PCIe 3.0 X4。同时,将其工作模式配置为Bridge模式,实现FPGA作为Host端,SSD作为Endpoint端的PCIe总线连接关系。除此之外,还对PCIe BAR空间与AXI BAR空间之间虚拟地址的相互转换关系进行配置,使Host端访问SSD中PCIe BAR空间的请求从AXI总线转换到PCIe总线上,或是将Endpoint端访问Host的请求从PCIe总线转换为AXI的总线请求。
3)用户逻辑模块作为本课题系统设计中的功能验证模块。用户逻辑模块将产生测试用的数据流以模拟实际输入的图像数据,并将产生的测试数据直接通过AXI-Stream接口传入NVMe控制器;或是接收从SSD端返回的读数据流,并对读数据流进行检查以验证正确性。
4)AXI Interconnect模块作为FPGA整体系统设计中不同模块间AXI总线接口的互连结构,可有效的组建AXI总线网络,这里不独立列出。AXI Interconnect可灵活应用于一主多从、多主一从及多主多从三种模式的AXI总线互连需求,并能够有效解决总线竞争或是性能面积取舍问题等。
AXI总线介绍
AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA3.0中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。 AMBA4.0 包括AXI4.0、AXI4.0-lite、ACE4.0、AXI4.0-stream。AXI4.0-lite是AXI的简化版本, AXI4.0-stream主要用在FPGA进行以数据为主导的大量数据的传输应用。
AXI读写架构
AXI协议是基于burst的传输,并且定义了以下5个独立的传输通道:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道。地址通道携带控制消息,用于描述被传输的数据属性;数据传输使用写通道来实现master到slave的传输,slave使用写响应通道来完成一次写传输;读通道用来实现数据从slave到master的传输。AXI读写架构如图2、图3所示:
AXI使用基于VALID/READY的握手机制数据传输协议,传输源端使用VALID表明地址/控制信号、数据是有效的,目的端使用READY表明自己能够接受信息。
读/写地址通道:读、写传输每个都有自己的地址通道,对应的地址通道承载着对应传输的地址控制信息。
读数据通道:读数据通道承载着读数据和读响应信号包括数据总线(8/16/32/64/128/256/512/1024 bit)和指示读传输完成的读响应信号。
写数据通道:写数据通道的数据信息被认为是缓冲(buffered),master无需等待slave对上次写传输的确认即可发起一次新的写传输。写通道包括数据总线(8/16…1024 bit)和字节线(用于指示8 bit 数据信号的有效性)。
写响应通道:slave使用写响应通道对写传输进行响应。所有的写传输需要写响应通道的完成信号。
AXI握手机制
5个传输通道均使用VALID/READY信号对传输过程的地址、数据、控制信号进行握手。使用双向握手机制,传输仅仅发生在VALID、READY同时有效的时候。
VALID/READY 分为以下三种情况:
1)VALID信号等待READY信号的到达,直到T3时刻完成传输,如图4所示。
2)READY信号先于VALID信号到达时,进行等待,直到T3时刻VALID信号与READY信号同时有效,完成一次传输,如图5所示。
3) VALID信号与READY信号同时到达,则T2时刻完成一次传输,如图6所示。
NVMe 主机控制器(HC) IP 说明
NVMe 控制器接口说明
为便于用户使用,本IP接口定义简洁,如图7所示。该模块接口包括S_AXI_Lite、M_AXI_SSD、S_AXI_SSD、done和error接口。
NVMeHC 模块接口基于AMBA总线协议,可实现与FPGA内其余模块之间高效交互。用户指令从S_AXI_Lite接口传入,指令执行完成后done接口输出高电平,同时如果指令执行过程中出现错误,error接口输出高电平。
各接口定义如下:
1)S_AXI_Lite接口
S_AXI_Lite接口为AMBA总线协议规范的AXI Lite Slave接口。用户通过S_AXI_Lite接口进行读写NVMeHC内部寄存器,以实现相应读写等指令。
表1 给出 S_AXI_Lite 接口定义。
S_AXI_Lite接口时序如图8:
当AWVALID与AWREADY同时有效时,完成一次AWADDR传输;当WVALID与WREADY信号同时有效时,完成一次WDATA的传输。
2)M_AXI_SSD接口
NVMeHC IP通过M_AXI_SSD接口发送指令更新SSD端的相应门铃寄存器。此接口符合AMBA AXI Full总线协议规范。
3)S_AXI_SSD接口
NVMeHC IP通过S_AXI_SSD接口向SSD端发送相应命令、接收从SSD端返回的完成信息。此接口符合AMBA AXI Full总线协议规范。
4)done接口
NVMeHC IP检查完成所有命令的完成信息后,置done信号为高电平。
5)error接口
当NVMeHC IP检查SSD端返回的完成信息中发现错误时,置error信号为高电平。
寄存器定义及引脚约束
1)寄存器定义
NVMeHC模块内部有4个寄存器,用户通过S_AXI_Lite接口配置对应寄存器,便可控制模块对SSD相应的读写操作。用户需要配置的寄存器如表2:
2)引脚约束
时钟频率:250MHZ
复位方式:低电平有效
操作流程
1)系统上电后,进入初始化配置阶段。分为2阶段:
(1)PCIe初始化
通过XDMA standalone driver对PCIe进行初始化操作。完成BAR0空间映射,链路状态检测,直至PCIe进行L0状态,且PCIeLinkUp信号有效。
(2)NVMe寄存器配置
PCIe初始化完成后,NVMeHC模块对SSD端NVMe寄存器初始化配置,初始化配置完成后便可对NVMe SSD进行读写等操作。
2)数据传输
每发起一次数据的读写传输,用户需配置NVMeHC相应寄存器以发起传输。配置寄存器顺序为:
(1)首先需配置源/目的地址寄存器、SLBA寄存器、数据量寄存器;
(2)最后配置指令寄存器,发起读、写、识别等操作;
*(例如:需要将FPGA DDR内起始源地址为0x60000000,数据大小为64MB的数据写入SSD端SLBA为0x0的目的地址。则操作过程为首先配置源/目的地址寄存器为0x60000000、SLBA寄存器为0x0、数据量寄存器为0x20000(64MB/512B = 0x20000),最后配置指令寄存器为写操作便可发起数据传输。)
当配置完成指令寄存器后,NVMeHC模块便根据用户配置的相关信息,通过XDMA模块控制SSD进行相应读写等操作。检查完成所有的完成信息后,通过done / error返回相应信号。