0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

NVME控制器之队列管理模块

高速传输与存储 来源:高速传输与存储 作者:高速传输与存储 2025-05-03 15:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

队列管理模块是整个NVMe Host控制器的核心模块,该模块实现了提交队列与完成队列的管理,多队列请求的仲裁判决等功能。队列管理模块中含有数据选择单元、SQ、CQ、和仲裁器等模块。其中Admin SQ与IO SQ的内部结构一致,包含状态机、BRAM、Tail REG和Head REG。Admin CQ与IO CQ的内部结构一致,包含状态机、Tail REG和Head REG。
队列管理模块框图如图1所示。

wKgZPGgVxQqADJyzAABA6tcvNUY291.png


图1 队列管理模块框图
在NVMe协议中,使用队列来传输、缓存和处理命令条目,以实现Host端和NVMe SSD端之间的通信。在CPU上运行NVMe软件协议栈,其Host端生成提交命令的速度远大于NVMe SSD的执行速度,同时由于CPU的指令是顺序执行的,需要通过中断来通知CPU去处理完成信息。因此,通过增加提交队列和完成队列的深度可以提高系统的传输性能。


设计中可以利用FPGA的并行处理能力来加速NVMe Host端的控制流程。相较于软件协议栈,通过硬件电路生成提交命令的速度更快,并且能够通过并行操作去实时检查返回的完成信息,从而避免了采用中断来通知CPU去处理完成信息而造成延迟较大的问题。本设计主要针对顺序读写场景进行了资源方面的优化。考虑到在顺序读写情况下,传输性能与队列深度的大小无关,且硬件逻辑生成NVMe命令的速度要远大于软件协议栈生成NVMe命令的速度,因此通过增加提交队列和完成队列的深度来提高系统的传输性能的方法不再可行,本设计将提交队列深度设置为NVMe SSD一次突发读取的数据量大小,这样在保证性能的前提下,可以尽可能的减少资源的消耗。此外,取消了完成队列缓存的设计,对完成信息的解析工作通过组合逻辑电路对其进行实时检测,而不用通过中断来通知NVMe Host检查,从而可以提高NVMe命令的执行效率,并节省了大量的存储资源。


提交队列内部由一个双端口RAM、两个寄存器和一个状态机构成。其中,提交队列分为Admin提交队列和I/O提交队列,分别用于管理Admin命令和I/O命令。虽然这两个队列针对的命令条目不同,但其内部结构相同。因此,通过采用相同的设计来实现两个队列,以提高代码的复用性和可维护性。双端口RAM使用BRAM资源实现,包括两个128位宽、深度可配置的端口,用于实现NVMe命令的缓存。四个控制寄存器用于监测队列状态,包括Head指针和Tail指针。Head指针指向队列中下一个被执行的命令的位置,Tail指针指向队列中下一个空位置,新产生的命令条目总是被写入Tail所指向的位置。当同一个队列的Head指针等于Tail指针加1时,表示队列为满;当Head指针等于Tail指针时,表示队列为空。该模块中的状态机用来实现门铃寄存器信息更新的流程控制工作。队列管理状态机的跳转图如图2所示。

wKgZPGgVxYWAD_ZRAAAxG-vHZ2U637.png

图2 队列管理状态机的跳转图

各状态说明如下:

IDLE:空闲状态,该状态为模块上电后的初始化状态,该状态下检测到s_axis_entry_valid信号有效时,表示有提交命令传输至队列管理模块,状态跳转至RD_SQ_REG状态,否则维持当前IDLE状态。

RD_SQ_REG:读提交队列寄存器状态,该状态下读取提交队列中的cmd_cnt寄存器,cmd_cnt寄存器负责记录队列中缓存的命令数,即SQ Head指针与SQ Tail指针之差,当cmd_cnt寄存器的值大于10时向仲裁器发起更新门铃寄存器请求,这里设置为10主要是考虑到减少NVMe Host控制器和NVMe SSD之间的数据交互次数,让其通过突发传输一次读取多条命令,来达到提升系统性能的效果,同时,为了解决长时间没有接收到新的提交命令使得小于10条命令无法发送的情况,添加了超时机制,当计时计数器达到一定值时,不再等待cmd_cnt满足条件,直接跳转至SC_REQ状态,否则维持当前状态。

SC_REQ:仲裁请求状态,该状态下将sq_req信号置为高电平来向仲裁器发起仲裁请求,若接收到仲裁授权,状态跳转至SEND状态,否则维持当前状态。

SEND:发送状态,该状态下向接口转换模块发送当前的队列信息,接口转换模块将内部信号转换为AXI4接口信号,通过访问PCIe的BAR空间来实现对NVMe SSD门铃寄存器的更新,等待返回应答信号,状态跳转至IDLE状态。

相关视频感兴趣的,请移步B站,搜用户名 专注与守望 或 内容 NVMe IP

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1665

    文章

    22587

    浏览量

    641250
  • 控制器
    +关注

    关注

    114

    文章

    17931

    浏览量

    196009
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RDMA设计25:队列管理模块发送模块详细设计分析

    发送队列存储为所有发送队列共用的存储空间,根据用户环境和开发板环境不同可由 BRAM、URAM 或 LUTRAM 实现。发送队列管理单元则负责管理这个存储空间,并处理用户指令和发送
    的头像 发表于 01-25 16:27 5933次阅读
    RDMA设计25:<b class='flag-5'>队列管理</b><b class='flag-5'>模块</b><b class='flag-5'>之</b>发送<b class='flag-5'>模块</b>详细设计分析

    RDMA设计27:队列管理模块设计完成模块详细分析

    。 (3)完成队列 完成队列管理由完成条目解析单元和异常完成条目处理单元组成。完成条目解析单元中只设置了一个虚拟完成队列,使用这样的结构设计原因有三。 一是当完成条目状态为正常完成
    发表于 01-23 08:52

    RDMA设计26:队列管理模块设计接收队列模块详细分析

    表单,并通知发送队列管理单元释放对应表单中的发送队列条目。同时接收队列管理单元也不再处理远程主机发送过来的数据,而是直接由 RoCEv2 接收模块通知 DMA
    发表于 01-22 09:03

    RDMA设计24:队列管理模块设计

    队列管理模块采用管理与存储分离的结构进行设计,由发送队列存储、发送队列管理、接收队列管理、完成条
    的头像 发表于 01-20 11:45 1639次阅读
    RDMA设计24:<b class='flag-5'>队列管理</b><b class='flag-5'>模块</b>设计

    RDMA设计18:队列管理模块设计3

    标识。故而只使用一个虚拟完成队列足以满足接收队列管理单元和发送队列管理单元的信息需求。这样的设计在一定程度上缩减存储资源开销的同时,也会进一步减小用户操作难度,使模块不再需要为每一个发
    发表于 01-05 09:04

    RDMA设计17:队列管理模块设计2

    接收模块通知 DMA 控制器处理数据。这样的设计使得接收队列管理单元并不需要占用存储资源,可以更好的节省系统的资源占用并提高接收队列处理效率。 B站已给出相关性能的视频,如想进一步了
    发表于 01-04 14:54

    NVMe高速传输摆脱XDMA设计54:如何测试队列管理功能2

    边界操作的错误反馈。 图1 队列管理串口打印信息三 B站已给出相关性能的视频,如想进一步了解,请搜索B站用户:专注与守望 链接:https://space.bilibili.com
    发表于 12-10 08:33

    NVMe高速传输摆脱XDMA设计53:如何测试队列管理功能

    本博文主要交流设计思路,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。若有NVME或RDMA 产品及项目需求,请看B站视频后联系。 这里通过实际环境中测试队列管理
    发表于 12-09 08:21

    NVMe高速传输摆脱XDMA设计37:队列管理功能验证与分析1

    。 测试点与对应测试步骤如表 1所示。 表 1 队列管理功能验证步骤 (1) 创建队列功能测试结果 测试步骤 1、 2 关键信号波形如图1 所示。 在配置队列控制寄存
    发表于 10-13 11:17

    NVMe IP高速传输却不依赖XDMA设计九:队列管理模块(上)

    这是采用PCIe设计NVMe,并非调用XDMA方式,后者在PCIe4.0时不大方便,故团队直接采用PCIe设计,结合UVM验证加快设计速度。 队列管理模块采用队列的存储与
    的头像 发表于 08-04 09:53 897次阅读
    <b class='flag-5'>NVMe</b> IP高速传输却不依赖XDMA设计<b class='flag-5'>之</b>九:<b class='flag-5'>队列管理</b><b class='flag-5'>模块</b>(上)

    NVMe高速传输摆脱XDMA设计十:队列管理模块设计(下)

    ​续上,队列管理模块采用队列的存储与控制分离的设计结构,如图1所示为队列管理模块的结构框图。 ​
    发表于 07-30 16:27

    NVMe高速传输摆脱XDMA设计九:队列管理模块设计(上)

    设计,结合UVM验证加快设计速度。队列管理模块采用队列的存储与控制分离的设计结构,如图1所示为队列管理
    发表于 07-27 17:41

    NVMe高速传输摆脱XDMA设计十:NVMe初始化状态机设计

    DISABLE_CC状态。 RD_CAP:读控制器功能寄存状态。该状态下读取NVMe设备的控制器功能寄存,获取其中的Memory Pag
    发表于 07-05 22:03

    NVMe IP高速传输摆脱XDMA设计四:系统控制模块设计

    系统控制模块负责实现 NVMe over PCI 逻辑加速引擎的控制功能, 其结构如图 1 所示。 用户通过系统控制
    发表于 06-29 18:07

    NVMe IP高速传输却不依赖XDMA设计四:系统控制模块

    系统控制模块负责实现 NVMe over PCI 逻辑加速引擎的控制功能, 其结构如图 1 所示。 用户通过系统控制
    的头像 发表于 06-29 17:52 687次阅读
    <b class='flag-5'>NVMe</b> IP高速传输却不依赖XDMA设计<b class='flag-5'>之</b>四:系统<b class='flag-5'>控制</b><b class='flag-5'>模块</b>