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
    +关注

    关注

    1655

    文章

    22283

    浏览量

    630192
  • 控制器
    +关注

    关注

    114

    文章

    17638

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    本文主要交流NVMe设计思路,在本博客已给出相关博文约四十篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。 4) 删除队列边界测试结果 测试步骤 7 关键信号波形
    发表于 10-23 16:24

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

    本文主要交流NVMe设计思路,在本博客已给出相关博文几十篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。有需求者请先看下面B站联系后再讨论。 (3) 删除队列功能
    发表于 10-22 10:14

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

    cr_status 值为 2, 表示创建数量错误, 因为最大 I/O 完成队列数量为 1, 因此后续的创建将返回数量错误, 并且创建过程不会向指令控制模块写入对应的 NVMe 指令,
    发表于 10-15 08:14

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

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

    NVMe高速传输摆脱XDMA设计20: PCIe应答模块设计

    、长度字段等,然后将数据字段写入数据缓存中。提取出的地址字段用于进行地址映射,在NVMe协议中,设备端的请求写分为两种,分别是写完成队列和写数据,因此地址映射的定向对应为队列管理模块
    发表于 08-12 16:04

    NVMe高速传输摆脱XDMA设计14: PCIe应答模块设计

    出TLP报头的地址字段、长度字段等,然后将数据字段写入数据缓存中。提取出的地址字段用于进行地址映射,在NVMe协议中,设备端的请求写分为两种,分别是写完成队列和写数据,因此地址映射的定向对应为队列管理
    发表于 08-04 16:44

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

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

    NVMe控制器IP设计接口转换

    (addr、en、data_db)转换为与AXI PCIe IP模块相连接的AXI4-Lite接口。该模块的主要功能是在队列管理模块需要更新SSD内部门铃寄存
    发表于 05-10 14:33

    NVME控制器队列管理模块

    队列管理模块是整个NVMe Host控制器的核心模块,该模块实现了提交
    发表于 05-03 20:19

    NVME控制器设计1

    的相关寄存来发送 DMA 或队列管理请求, NVMe控制模块在得到任务信息后生成对应的 NVMe
    发表于 04-24 09:45