XDuser

专注于NVMe IP, NVMe包括RDMA,NVMe Host ,NVMe OF。期待与你相约。

基于FPGA的NVMe over PCIe逻辑加速引擎之PCIe加速模块设计(上)

0
阅读(1145)

PCIe 加速模块总体设计

     PCIe 加速模块负责处理 PCIe 事务层, 并将其与 NVMe 功能和 AXI 接口直接绑定。 如图1 所示, PCIe 加速模块按照请求发起方分为请求模块和应答模块。 请求模块负责将内部请求事务转换为配置管理接口信号或 axis 请求方请求接口信号( axis_rq), 以及解析 axis 请求方完成接口信号(axis_rc); 应答模块负责接收 axis完成方请求接口信号(axis_cq), 将请求内容转换为 AXI4 接口信号或其它内部信号做进一步处理, 同时将应答事务通过 axis 完成方完成接口(axis_cc) 发送给 PCIE 集成块。

PCIe 加速模块不仅承担了 TLP 与其它接口信号的转换功能, 也是降低传输延迟、增加吞吐量的核心部件。 接下来分别对请求模块和应答模块的结构设计进行具体分析。


PCIe 请求模块设计

     请求模块的具体任务是将系统的请求转换成为 axis 接口形式的 TLP 或配置管理接口信号。 这些请求主要包含初始化配置请求和门铃写请求。 初始化配置请求由初始化模块发起, 当配置请求的总线号为 0 时, 请求通过 Cfg_mgmt 接口发送给 PCIE 集成块; 当配置请求的总线号不为 0 时, 请求以 PCIe 配置请求 TLP 的格式从 axis_rq接口发送到 PCIE 集成块, 然后由硬核驱动数据链路层和物理层通过 PCIe 接口发送给下游设备, 下游设备的反馈通过 axis_rc 接口以 Cpl 或 CplD 的形式传回。 门铃写请求由 NVMe 控制模块发起, 请求以 PCIe 存储器写请求 TLP 的格式从 axis_rq 接口交

由 PCIE 集成块发送。

     由于发起请求的模块存在多个, 并且在时间顺序上初始化模块先占用请求,NVMe 控制模块后占用请求, 不会出现请求的竞争, 因此设置一条内部请求总线用于发起请求和接收响应, 该请求总线也作为请求模块的上游接口。 请求模块的请求总线接口说明如上表 1 所示。 无论是配置请求还是门铃写请求, 请求的数据长度都只有一个双字, 因此设置读写数据位宽均为 32 比特。在接收到请求总线接口的请求事务后, 当请求类型的值为 0 时, 表示通过 PCIE集成块的配置管理接口发送请求, 由于请求接口的接口和时序与配置管理接口基本一致, 因此此时直接将请求接口信号驱动到配置管理接口完成请求的发送, 请求读数据和响应也通过选通器连接到配置管理接口。 当请求类型值不为 0 时, 则需要将请求转 NoP 逻辑加速引擎设计换为 TLP 以 axis 接口形式发送, 这一过程通过请求状态机实现, 请求状态机的状态转移图如图2所示。 各状态说明如下:

感兴趣看视频demo,请到B站搜用户名  专属与执着。或https://www.bilibili.com/video/BV1jJ4m1n7Yy/