基于 FPGA 的 NVMe 接口设计--笔记

总线是计算机系统中从设备与总线控制器之间交换数据的通道。扩展总线是由 PC 机中发展出的概念,指的是连接 PC 系统中的 CPU 与插在扩展槽上的外设之间的总线。PCI Express 就是一种扩展总线,但由于其高速低延迟的高性能,及良好的扩展性,PCI Express 在嵌入式系统中也获得了广泛的应用。
 但 PCI 总线作为一种多设备共用的并行总线,其先天的劣势是:
 1)  并行信号带来的信号完整性问题,以及共用信号线带来的驱动能力问题,这都使得总线频率难以提升。
 2)  共用信号线的形式使得外设增多时无法满足实时性要求,分配给每个设备的带宽也急剧下降。
 3)  并行总线使之使用了过多的针脚,增加了 PCB 布线和连接器设计的困难,影响嵌入式系统的集成度。
 PCIe 总线是 PCI 总线的后继者。PCIe 是一种全双工的串行总线,并具有带宽可扩展的特性,而且向后兼容。

NVMe 协议兼容全部的 PCIe所支持的中断模式,并且这是由设备在初始化时与主机协商的,但规范中强烈建议不要使用 Legacy 模式。 在本文项目中,由于硬件限制(Xilinx 的 IP 核并不持 MSI-X),所以最终选择了MSI 作为设计中使用的中断模式。 

PCIe 总线上并没有形成类似 USB 的那么多标准化的逻辑接口,这与 PCIe 的定位有关。一般来说 PCIe 终端设备的驱动都是由各个厂商自行维护,以满足高性能的需求。PCIe 用于大容量存储设备时依然是如此,众多厂商开发一系列互不兼容的产品,用于服务器等大型系统。这种情况持续至今,直到 NVM Express 出现。

NVM Express 正是一种为非易失存储介质在 PCIe 上的应用而设计的逻辑接口。作为一种存储器逻辑接口,NVMe 向主机隐藏了存储介质的细节,使得主机可以以LB(Logical Block,逻辑扇区)为最小单位进行访问,用于定位的是 LBA(Logical Block Address,逻辑扇区地址),用于描述写入或读取长度的是 NLB(Number of Logical Block)。这样主机无需关心电子盘内部存储的格式,可以将电子盘当作传统的块存储设备(Block Device)来操作,实现了通用性和兼容性。而 
NVMe 作为新兴的存储器逻辑接口有着诸多优势:
NVMe 从制定之初就是面向固态硬盘的需求而设计,因而支持更多的针对 Flash的优化。

NVMe 考虑到了 SSD 的低延迟特性。

NVMe 为未来的高性能存储设计。

NVMe 针对数据中心的应用提供了大量新特性。

NVMe 的基本流程基于 FPGA 的 NVMe 接口设计--笔记_第1张图片

值得注意的是,主机全程都没有去读取设备的寄存器,对于主机来说,几乎所有操作都是在主机内存中完成的,仅仅是写入两次门铃寄存器。

NVMe 使用一种自定义大小的循环队列来来组织指令,并且规定队列里的内容是允许由控制器来决定执行顺序。队列的处理使用生产-消耗规则,并规定队尾是生产者,队首是消耗者。队列的实际容量则是 N-1。队列由主机在自身内存中建立,在主机内存中填充指令,控制器通过 BMD 方式从主机取得指令,自行解析、排序并执行。NVMe 相对于 AHCI 的一大特点是对乱序指令的完整支持,这是其有别于传统存储控制器接口的一大特点。对乱序指令的的支持必然涉及优先级问题。NVMe 目前规定了两种优先级裁决方式:循环调度(Round Robin Arbitration)和带有紧急优先级的加权循环调度(Weighted Round Robin with Urgent Priority Class Arbitration)。前者是基本裁决方式,使用一个转盘来循环执行各个队列,后者是可选裁决方式。

每一条 NVMe 指令都是地址对齐的,长度固定为 64 字节,对应的回执也是对齐的,长度至少 16 字节,并将可以由控制机和主机协商指令和回执长度,但仍必须保证对齐,大于标准长度的部分使用 0 填充。NVMe 使用一个包含最少基本指令的指令集。管理指令(Admin Command)包含 10条必须实现的基本指令,而 NVM 指令只包含 3 条基本指令,其余都是可选功能。
 

要实现一个电子盘,除了实现电子盘所需要进行的电路设计外,依据各项工作的互相联系程度来划分,可以将其它工作划分为三块:驱动、接口、存储系统。
基于 FPGA 的 NVMe 接口设计--笔记_第2张图片
 NVMe 控制器中的接口子系统的开发是使用 FPGA 发板进行的,最终目标是与驱动一同实现从主机内存到控制器内存的数据传输。本文阐述的就是这一部分的实现。

 对于 FPGA 选型整理出如下要求和建议:
 有硬核 MCU 或 CPU,并有满足一定的性能要求;
 能够实现 PCIe 接口,即带有高速串行接口,最好能集成物理层硬核;
 有足够的逻辑资源来实现纠错算法。基于上面的要求和建议,最终选定采用Xilinx公司的Zynq系列硬核 ARM SoC FPGA解决方案。

开发工具:

在本项目中,PCIe 终端和 DMA 的实现都在 Vivado 的 IPI 环境下完成,因而 Vivado和 IPI 是本项目重要的相关技术之一。在本项目中,NVMe 主进程在 ARM 核中允许,使用 C 语言编写,因而 Xilinx SDK是本项目相关的重要技术之一。


 SoC 内部功能框图基于 FPGA 的 NVMe 接口设计--笔记_第3张图片

分为 PL 与 PS 两大部分,前者类似于 FPGA 逻辑开发,开发工具Vivado,使用 Verilog 语言;后者类似于嵌入式开发,在 Xilinx SDK 中完成,使用 C 语言。
 
 

 


 

你可能感兴趣的:(fpga开发,学习)