本文主要交流NVMe设计思路,在本博客已给出相关博文几十篇,希望对初学者有用。注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP设计。
想用于项目或产品的,前先看下面视频后决定。
NVMe 设备模型一方面模拟 PCIe EP 设备功能, 另一方面模拟 NVMe 行为功能,实现 NVMe 协议事务的处理。 PCIe EP 设备具有 TYPE0 类型的配置空间, 要模拟NVMe 设备则需要开启至少 8KB 的 BAR0 空间, BAR0 地址空间中存放 NVMe 设备寄存器组, 其中包含了初始化过程中需要使用的控制器功能寄存器、 控制器状态寄存器、控制器配置寄存器、Admin 队列属性寄存器、Admin 提交队列地址寄存器和 Admin完成队列地址寄存器, 以及在队列工作中需要使用的门铃寄存器组。 NVMe 设备模型将配置空间头部和需要使用的 NVMe 寄存器组封装为 NVMe 设备模型配置空间类,在类中提供读写功能函数方便调用。
NVMe 设备模型的工作通过 TLP 接收进程、 Admin 提交队列进程、 Admin 完成队列进程、 I/O 提交队列进程、 I/O 完成队列进程共同实现。
TLP 接收进程负责处理模型输入接口事务。 当模型输入接口接收到新的 TLP 后,如果类型为 CplD, 回收 tag 放入 tag 池, 同时根据 tag 将包分类为数据响应包、 指令响应包、 PRP 响应包并将其放入对应的缓存队列中。 如果类型为 TLP 请求, 根据请求类型对配置空间或 BAR 空间进行读写操作, 读操作生成 CplD 发送到模型输出缓存。
Admin 提交队列进程负责实现提交队列机制和处理 Admin 命令。 当 BAR 空间的Admin 提交队列尾门铃寄存器的值与 Admin 提交队列存储的尾门铃值不相同时, 根据二者差值计算需要请求的指令数量, 然后从输出端口发送相应数量的读请求 TLP包读取指令。 当 Admin 提交队列对应的指令响应包队列非空时, 从队列中获取一个响应包, 提取出 Admin 提交指令条目, 跟据条目中的信息执行不同的指令操作。 在执行完指令操作后, 更新 Admin 提交队列头门铃, 并生成完成条目, 将完成条目发送到 Admin 完成队列进程缓存。
Admin 完成队列进程负责实现完成队列机制和发送完成条目。 当 Admin 完成队列进程缓存非空时, 从缓存中获取完成条目, 并将完成条目组装成 TLP 请求, 然后从输出端口发送请求。
I/O 提交和完成队列进程与 Admin 提交和完成进程基本流程一致, 不同的是在处理指令过程中, NVMe 写和读指令需要与主机进行更多的 TLP 事务交互, 包括读指令、 读写数据、 读 PRP 等, 这些事务使用 tag 进行标记区分, 因此能够实现多个并行的 I/O 提交队列进程。 为与待测设计匹配, NVMe 设备模型支持最大 16 个 I/O 提交队列.
B站已给出相关性能的视频,如想进一步了解,请搜索B站用户:专注与守望
链接:https://space.bilibili.com/585132944/dynamic?spm_id_from=333.1365.list.card_title.click
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|