CMAC USPLUS (CAUI-4) 使用方式分析
in hsb fpga/pynq/
基于
FPGA_top.sv、eth_100gb_top.sv、rst.sv三个 SystemVerilog 文件,并结合Xilinx PG203 (Integrated 100G Ethernet Subsystem v3.0)文档的总结。
1. 整体架构
该设计采用Xilinx UltraScale+ 集成 100G 以太网子系统 (CMAC USPLUS)作为 100GbE 主机接口,配置为CAUI-4 模式(通过 4 路 GT 收发器实现,每路 25.78125 Gbps)。
层次结构如下:
FPGA_top.sv (顶层) ├── eth_100gb_top.sv (CMAC/GT 封装与初始化) │ └── design_1 (Vivado Block Design 生成的 CMAC + GT Wrapper) ├── rst.sv (复位控制) └── HOLOLINK_top.sv (业务逻辑)2. 时钟结构
根据 PG203 和代码,时钟连接如下:
| 信号 | 来源/去向 | 说明 |
|---|---|---|
ETH_REFCLK_P/N | 外部 156.25 MHz 差分时钟 | 输入到gt_ref_clk_0_clk_p/n,作为 GT 的参考时钟 |
init_clk | 板载 100 MHz 经 IBUFDS+BUFG | 自由运行时钟,用于 GT 复位状态机 (init_clk_0) |
o_usr_clk(gt_txusrclk2_0) | CMAC/GT 输出 | 约322 MHz的用户数据时钟,驱动所有 AXI4-Stream 接口和 HOLOLINK 数据平面 |
o_aclk(clk_out1_0) | CMAC 内部 Clocking Wizard | 50 MHz,作为 APB 控制平面时钟 |
o_ptp_clk(clk_out2_0) | CMAC 内部 Clocking Wizard | 100 MHz,用于 PTP/IEEE 1588 时间戳 |
关键点:usr_clk是数据平面的唯一主时钟,HOLOLINK 的传感器接口和主机接口均工作在该时钟域下。
3. 复位策略
代码实现了两级复位,严格遵循 PG203 的复位要求:
(1) CMAC/GT 系统复位 (i_cmac_rst→sys_reset_0)
- 在
FPGA_top中,使用init_clk域的状态机监测gt_powergoodout(4-bit,等待所有 4 个 lane 的 Power Good 都置位后),生成rst_all。 rst_all作为i_cmac_rst输入eth_100gb_top,连接到 CMAC 的sys_reset_0。- 作用:复位 GT 收发器和 CMAC 核心,需在时钟稳定期间保持。
(2) 系统级复位 (sys_rst与cmac_sys_rst)
rst.sv模块区分了:o_cmac_sys_rst:由软件复位 (i_sw_rst) 和 PLL 锁定状态控制,用于 CMAC。o_sys_rst:不仅依赖 PLL 锁定,还依赖mac_aligned(即stat_rx_aligned经跨时钟域同步到 APB 时钟域)。这意味着整个系统必须在 CMAC 接收端完成 Lane 对齐后,才会退出复位。
4. GT 串行接口 (CAUI-4)
// 4 路差分 RX/TX,对应 CAUI-4 的 4 个 SerDes lane input [3:0] gt_serial_port_0_grx_p, gt_serial_port_0_grx_n; output [3:0] gt_serial_port_0_gtx_p, gt_serial_port_0_gtx_n;- 代码中实例化了 4 路 GT 通道,与 CAUI-4 模式匹配。
- 输出信号:
gt_powergoodout[3:0]:各路 GT 电源良好指示。gt_ref_clk_out:GT 参考时钟输出(可用于监测)。
5. AXI4-Stream 用户数据接口
CMAC 配置为AXI4-Stream 用户接口(非 LBUS)。数据宽度为512-bit,在usr_clk域工作。
TX 方向 (HOLOLINK → CMAC → 网线)
axis_tx_0_tdata [511:0] axis_tx_0_tkeep [63:0] axis_tx_0_tlast axis_tx_0_tuser axis_tx_0_tvalid axis_tx_0_tready (反压信号)RX 方向 (网线 → CMAC → HOLOLINK)
axis_rx_0_tdata [511:0] axis_rx_0_tkeep [63:0] axis_rx_0_tlast axis_rx_0_tuser axis_rx_0_tvalid这些信号在FPGA_top中直接连接到HOLOLINK_top的主机接口(Host IF),实现了 HOLOLINK 协议栈与 100GbE 物理层的对接。
6. CMAC 控制/状态信号
代码中使用了以下 PG203 定义的关键控制/状态端口:
| 信号名 | 方向 | 说明 |
|---|---|---|
ctl_rx_0_ctl_enable | Input | RX 路径使能,必须置 1 才能正常接收 |
ctl_rx_0_ctl_rx_force_resync | Input | RX 强制重新同步/对齐,平时为 0 |
ctl_tx_0_ctl_enable | Input | TX 路径使能,需在对端就绪后才置 1 |
ctl_tx_0_ctl_tx_send_rfi | Input | 发送 Remote Fault Indication (RFI),未对齐前应置 1 |
ctl_tx_0_ctl_tx_send_lfi | Input | 发送 Local Fault Indication (LFI) |
ctl_tx_0_ctl_tx_send_idle | Input | 发送 Idle 码 |
stat_rx_aligned | Output | 关键状态:所有 PCS Lane 已完成对齐/解偏斜 |
usr_tx_reset_0(o_usr_rst) | Output | CMAC 输出的 TX 用户逻辑复位 |
7. Core Bring Up Sequence (核心启动状态机)
这是代码中最关键的 CMAC 使用部分。eth_100gb_top.sv中实现了一个 3 状态 FSM,完全遵循 PG203 推荐的 “Without AXI4-Lite Interface” 启动序列:
typedef enum logic [1:0] { IDLE = 2'b00, WAIT = 2'b01, RX_ALIGNED = 2'b10 } state_rx_init;启动流程:
IDLE 状态(复位后):
- 置位
ctl_rx_enable = 1(使能接收路径)。 - 置位
ctl_tx_send_rfi = 1(向链路对端发送 Remote Fault,表明本端尚未准备好接收数据)。
- 置位
WAIT 状态:
- 持续等待
stat_rx_aligned == 1(本端 RX 完成 Lane 对齐,可以正确接收数据)。 - 一旦对齐:
- 撤销
ctl_tx_send_rfi = 0(不再发送 Remote Fault)。 - 置位
ctl_tx_enable = 1(使能发送路径,开始正常发送以太网帧)。 - 进入
RX_ALIGNED状态。
- 撤销
- 持续等待
RX_ALIGNED 状态:
- 正常工作状态,数据可以正常收发。
PG203 原文要求:
CTL_TX_ENABLE不应在对端 RX 对齐就绪前置 1,否则会导致数据丢失。代码中的 RFI 机制正是为了避免这一问题。
8. 未使用的功能
代码中明确将以下端口置为无效(Tie-off),表明未使用这些高级功能:
core_drp_*:未使用动态重配置端口 (DRP)。gt_loopback_in_0:接12'b0,未启用近端/远端环回。- AXI4-Lite 配置接口:未使用寄存器映射方式配置 CMAC,所有控制直接通过端口信号由状态机驱动。
9. 与上层 HOLOLINK 逻辑的集成
- 数据平面:
usr_clk同时驱动 CMAC AXI4-Stream 接口和 HOLOLINK 的 Sensor/Host 接口,确保数据路径处于同一时钟域,简化时序。 - PTP 支持:代码从 CMAC 获取
ptp_clk(100 MHz),并通过streaming_cdc将 PTP 时间戳(ptp_sec,ptp_nsec)同步到usr_clk域,供数据帧打时间戳使用。 - ILA 调试:在
usr_clk域实现了多个 ILA(Integrated Logic Analyzer),用于抓取 PTP 时间戳、帧计数器、Sensor 接口数据等信号。
总结
该代码以一种标准且规范的方式使用 CMAC USPLUS IP:
- 模式:CAUI-4 (4x25.78125G),AXI4-Stream 512-bit 接口。
- 时钟:156.25 MHz 外部参考时钟输入,生成 ~322 MHz 用户数据时钟。
- 复位:分层复位策略,确保 GT 和 CMAC 在时钟稳定后释放,且系统级复位依赖 RX 对齐完成。
- 启动:严格遵循 PG203 推荐的 Bring Up Sequence,通过状态机管理
ctl_rx_enable→ctl_tx_send_rfi→ 等待stat_rx_aligned→ctl_tx_enable的时序,保证链路双方可靠建立。 - 数据通路:CMAC 的 AXI4-Stream 直接对接 HOLOLINK 协议栈,形成完整的 100GbE 传感器桥接方案。