cndm代码框架和修改分析
基于对代码的初步分析,cndm 目录下的代码实现了一个名为 “Corundum-micro” 的微控制器框架,主要用于 FPGA 上的高性能网络接口卡 (NIC) 功能。该框架基于 PCIe 接口,支持多端口以太网数据传输、DMA 操作、队列管理、PTP (精确时间协议) 时间同步,以及控制寄存器访问。代码采用 SystemVerilog 编写,使用 TAXI (可能是 “TAXI AXI” 的缩写) 库提供的接口定义,如 taxi_axil_if (AXI Lite)、taxi_axis_if (AXIS)、taxi_dma_* 等。
主要功能模块
- cndm_micro_core.sv: 核心逻辑模块,负责整体协调。包括:
- 控制寄存器接口 (AXI Lite),用于配置和状态读取(如 PTP 时间戳、命令邮箱)。
- DMA 接口:处理读/写描述符和 RAM 访问,支持数据传输。
- 中断接口 (AXIS),用于事件通知。
- PTP 接口:提供时间同步功能,包括 TOD (Time of Day) 和相对时间戳。
- 以太网接口:多端口 AXIS 接口,用于 TX/RX 数据流,支持完成信号 (cpl)。
- 内部逻辑:包括命令邮箱 (cmd_mbox)、端口互联 (axil_interconnect),以及对其他子模块的实例化。
- cndm_micro_pcie_us.sv: PCIe 用户侧模块,针对 UltraScale FPGA。负责 PCIe 到内部逻辑的桥接:
- PCIe 接口:包括 CQ (Completion Queue)、CC (Completion)、RQ (Request)、RC (Receive) AXIS 流,以及配置管理 (cfg_mgmt)、中断 (MSI)、流控制 (FC) 等。
- 使用
taxi_pcie_us_axil_master将 PCIe 事务转换为 AXI Lite,用于控制访问。 - 实例化
cndm_micro_core,并连接 DMA、PTP、以太网等接口。 - 参数化支持:如 RQ 序列号宽度、AXI Lite 数据/地址宽度。
- 其他 RTL 文件:
cndm_micro_cmd_mbox.sv: 命令邮箱模块,处理命令和响应 (AXIS 接口)。cndm_micro_cpl_wr.sv: 完成写模块,可能用于 DMA 完成处理。cndm_micro_desc_rd.sv: 描述符读模块,用于 DMA 描述符读取。cndm_micro_dp_mgr.sv: 数据路径管理器,协调数据流。cndm_micro_port.sv: 端口模块,处理以太网端口逻辑。cndm_micro_queue_state.sv: 队列状态管理。cndm_micro_rx.sv/cndm_micro_tx.sv: RX/TX 处理模块。
- 库文件 (lib/taxi/src/): 提供底层支持,如 PCIe (taxi_pcie_us_axil_master.sv 等)、AXI、AXIS、DMA、PTP 等接口和原语。
整体框架
- 架构: 这是一个 PCIe 驱动的 NIC 微控制器,PL (Programmable Logic) 侧实现。外部通过 PCIe 与主机通信,内部通过 AXIS 处理以太网数据,AXI Lite 用于控制,DMA 用于高效数据传输。支持多端口 (默认 2 个),可配置 PTP 时间同步。
- 数据流: 主机 → PCIe → AXI Lite (控制) / DMA (数据) → 内部逻辑 → AXIS → 以太网端口。
- 配置: 参数化设计,支持不同供应商 (Xilinx/Altera)、设备家族、时钟周期、队列宽度等。
- 依赖: 高度依赖 TAXI 库的接口定义,模拟和综合友好 (SIM 参数)。
该框架适用于高吞吐量网络应用,如数据中心 NIC 或 TSN (Time-Sensitive Networking)。
将 PCIe 改为 PS 和 PL 的 AXI 的工作量分析
将 PCIe 接口替换为 PS (Processing System, ARM 侧) 和 PL (FPGA 侧) 之间的 AXI 接口,意味着从外部 PCIe 总线改为内部 AXI 互联 (如 Zynq/Zynq UltraScale 的 AXI 总线)。这会移除 PCIe 桥接层,直接通过 AXI 进行控制和数据传输。PS 可以作为主机,通过 AXI 访问 PL 侧的逻辑。
工作量评估
- 总体工作量: 中等到大 (预计 2-4 周开发时间,取决于经验)。主要涉及接口替换和桥接逻辑重写。无需完全重构核心逻辑,但需要添加 AXI 桥接模块。测试和验证 (尤其是时序和数据一致性) 会占用一半时间。
- 复杂度原因: PCIe 涉及复杂的协议 (TLP、流控制、中断),而 AXI 是标准总线,更简单。但需要确保 AXI 事务映射到原有 DMA/控制逻辑。
需要修改的文件和内容
- cndm_micro_pcie_us.sv (主要修改,~80% 重写):
- 移除所有 PCIe 相关接口 (s_axis_pcie_cq, m_axis_pcie_cc 等)、配置信号 (cfg_mgmt, cfg_fc 等)、MSI 中断。
- 替换为 AXI 接口:添加 AXI4/AXI4-Lite 主/从接口,用于控制和数据传输 (e.g.,
taxi_axil_if或taxi_axi_if)。 - 移除
taxi_pcie_us_axil_master实例,改为直接 AXI 互联。 - 修改实例化
cndm_micro_core的方式:将 PCIe 时钟/复位替换为 AXI 时钟/复位。 - 添加 AXI 桥接逻辑:将 AXI 事务转换为内部 DMA/控制信号 (e.g., 使用 TAXI 库的 AXI 适配器)。
- cndm_micro_core.sv (中等修改,~30% 调整):
- 修改接口:移除 PCIe 相关输入 (如 pcie_rq_seq_num),添加 AXI 接口参数。
- 更新内部互联:
axil_ctrl数组可能需要调整,以直接连接 AXI 而非 PCIe 桥。 - 确保 DMA 和 AXIS 接口与 AXI 时钟域一致 (可能需要时钟域交叉 CDC 逻辑)。
- lib/taxi/src/pcie/rtl/ 文件 (可能移除或最小修改):
taxi_pcie_us_axil_master.sv等 PCIe 特定文件:如果不再使用,可移除或归档。- 如果需要保留 MSI 中断模拟,可保留
taxi_pcie_us_msi.sv并适配为 AXI 中断。
- 其他 RTL 文件 (轻微修改,~10%):
cndm_micro_cmd_mbox.sv等:接口信号可能不变,但需要验证与新 AXI 层的兼容性。- 添加新文件:可能需要创建
cndm_micro_axi_bridge.sv或类似模块,将 AXI 转换为内部格式 (e.g., AXI 到 DMA 描述符的映射)。
- 顶层集成:
- 在更高层 (如 Vivado 设计) 中,移除 PCIe IP 核,添加 AXI Interconnect 或 SmartConnect,将 PS 的 AXI 端口连接到 PL 侧的 cndm 模块。
- 更新约束和时序:AXI 总线时序不同于 PCIe,需要调整 .xdc 文件。
潜在挑战和注意事项
- 时钟域: PCIe 和 AXI 可能有不同时钟,需要添加 CDC (Clock Domain Crossing) 逻辑以避免亚稳态。
- 中断: PCIe MSI 需替换为 AXI 中断 (e.g., 通过 PL 到 PS 的中断线)。
- 性能: AXI 可能有带宽限制 (相比 PCIe),需验证吞吐量。
- 测试: 需要在 Zynq 板上测试 AXI 事务,确保数据完整性。使用 ILA 或类似工具调试。
- 依赖: 确保 TAXI 库支持 AXI 接口;如果不支持,可能需自定义适配器。
cndm代码框架和修改分析
http://witbit.cn/FPGA/taxi/cndm代码框架和修改分析.html