
基于NVMEOF和RNIC的RDMA上NVME存储扩展FPGA实现:包含nvmof和rnic的IP源代码、
参考设计工程、上位机软件及计算机驱动
## 当FPGA遇上NVMe舰队:一次硬件加速的存储狂欢
凌晨三点的实验室里,调试器的绿灯第三次熄灭时,我终于在Xilinx Vivado的波形图里逮到了那
个调皮的跨时钟域bug。这个基于NVMe-oF的FPGA存储扩展方案,正在用RoCE协议把八块PCIe SSD拧成一股
4800MB/s的数据洪流。
### 从协议栈到硬件实现的奇幻漂流
NVMe-oF协议栈在FPGA上的落地,本质上是把存储命令装进RDMA的数据包。我们的核心武器是三个I
P核:NVMe控制器、RoCEv2协议栈、以及自定义的DMA引擎。这好比在FPGA内部搭建了一条直通SSD的高速公
路:
```verilog
// 精简版NVMe SQ处理模块
always @(posedge clk) begin
if (cmd_valid && !sq_full) begin
sq_buffer[sq_head] <= {lba, opcode, data_ptr};
sq_head <= (sq_head == SQ_DEPTH-1) ? 0 : sq_head + 1;
// 触发DMA引擎搬运命令数据
dma_start <= 1'b1;
dma_src_addr <= data_ptr;
end
// 状态机处理省略...
end
```
这段RTL代码像交通指挥员,把来自网络的NVMe命令塞进Submission Queue。注意那个精妙的sq_he
ad指针回绕——这是防止队列溢出的小魔法,当指针触底时瞬间弹回起点,像极了玩超级玛丽时的水管工
跳跃。
### FPGA上的IP核舞蹈
Xilinxxdma_ip核和我们的自定义RoCE模块跳着精密的双人舞。下面的代码片段展示了如何用AXI-
Stream接口粘合这些IP:
```systemverilog
// RoCE数据包封装流水线