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/控制逻辑。

需要修改的文件和内容

  1. 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_iftaxi_axi_if)。
    • 移除 taxi_pcie_us_axil_master 实例,改为直接 AXI 互联。
    • 修改实例化 cndm_micro_core 的方式:将 PCIe 时钟/复位替换为 AXI 时钟/复位。
    • 添加 AXI 桥接逻辑:将 AXI 事务转换为内部 DMA/控制信号 (e.g., 使用 TAXI 库的 AXI 适配器)。
  2. cndm_micro_core.sv (中等修改,~30% 调整):
    • 修改接口:移除 PCIe 相关输入 (如 pcie_rq_seq_num),添加 AXI 接口参数。
    • 更新内部互联:axil_ctrl 数组可能需要调整,以直接连接 AXI 而非 PCIe 桥。
    • 确保 DMA 和 AXIS 接口与 AXI 时钟域一致 (可能需要时钟域交叉 CDC 逻辑)。
  3. lib/taxi/src/pcie/rtl/ 文件 (可能移除或最小修改):
    • taxi_pcie_us_axil_master.sv 等 PCIe 特定文件:如果不再使用,可移除或归档。
    • 如果需要保留 MSI 中断模拟,可保留 taxi_pcie_us_msi.sv 并适配为 AXI 中断。
  4. 其他 RTL 文件 (轻微修改,~10%):
    • cndm_micro_cmd_mbox.sv 等:接口信号可能不变,但需要验证与新 AXI 层的兼容性。
    • 添加新文件:可能需要创建 cndm_micro_axi_bridge.sv 或类似模块,将 AXI 转换为内部格式 (e.g., AXI 到 DMA 描述符的映射)。
  5. 顶层集成:
    • 在更高层 (如 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
作者
朝彻
发布于
2026年4月5日
许可协议