这一篇在干嘛?

这是 UG1117 系列的第 1 篇,不讲具体怎么配链路,而是教你”怎么读这本手册”。寄存器手册有 400 多个寄存器,逐个背是不可能的;正确的做法是先建立地图——知道哪类功能住在哪段地址、表格怎么读、哪些位能写哪些只能看,之后需要什么再按图索骥。同系列第 2 篇见 核心模块寄存器与配置流程

CGMAC 是什么,这本手册管多大范围

全书结构:17 个寄存器组的地图

通道号 K:基地址计算的关键变量

位域表格五列结构:手册的通用语言

读写属性:RO、RW、RW1C、ROP 各是什么意思

Reset Value:为什么默认值本身就携带信息

RESERVED、unused、SPARE:三类”别碰”的位怎么区分

寄存器族规律:一份模板管几百个寄存器

CGMAC 是什么,这本手册管多大范围

CGMAC 是安路 SALPHOENIX®2A 系列 FPGA 中的多速率以太网 MAC/PCS 硬核。“C”可以理解为 Compound(复合)——它不是单一的千兆 MAC,而是一个能覆盖 10G/25G/40G/50G/100G 以太网、还能兼容 128GFC、FlexO、OTU50/OTU25 这类 OTN 协议的复合数据通路。手册封面写明适用文档号为 UG1117,版本 v1.1(2024 年 11 月 18 日更新,这一版改了 4.4 PM_TICK_PERIOD、4.19 SW_CLK_GATE_CONFIG、4.18 RESET_CONFIG 三节内容)。

整个 CGMAC 内部可以粗分为四层,寄存器也是按这个层次分组的:

层次干什么对应寄存器组
复位/基础全局复位、时钟门控、带宽选择RESET_CTRL、COMMON_CFG
SerDes 适配Gearbox 变宽、CDC 跨时钟 FIFOSERDES_HANDLER_CTRL
PCS 层66b 编解码、加扰/解扰、AM 对齐、RS-FEC各速率 AM_CFG、TX/RX_PCS_RSFEC、TX/RX_PCS_BASE
MAC 层成帧、前导码/FCS 处理、PAUSE/PFC 流控、统计TX_MAC、RX_MAC

手册定位

这本手册是寄存器参考书,不是应用指南——它告诉你每个位是什么,但不会手把手教你”配 100G 要按什么顺序写”。协议本身(IEEE 802.3、OIF FlexO 等)的知识需要另外补。另外按惯例,TD 软件生成的配置优先于手册中的默认值描述。

全书结构:17 个寄存器组的地图

手册第 1 章 MEMORY MAP 是全书的”总目录”,用一张表给出 17 个寄存器组的基地址。这张表值得抄下来贴在工位上:

寄存器组类别寄存器组名寄存器组基地址描述
PCS层寄存器RESET_CTRL16’h0000控制 CGMAC 内部的 core 和 serdes_handler 数据通道复位、regmap 配置寄存器复位
PCS层寄存器SERDES_HANDLER_CTRL16’h0100serdes_handler 的配置
PCS层寄存器COMMON_CFG16’h0200CGMAC 基本配置
PCS层寄存器ETH_100G_AM_CFG16’h1400以太网 100G RS-FEC AM Pattern 配置
PCS层寄存器ETH_50G_AM_CFG16’h1500以太网 50G RS-FEC AM Pattern 配置
PCS层寄存器ETH_25G_AM_CFG16’h1600以太网 25G RS-FEC AM Pattern 配置
PCS层寄存器128GFC_AM_CFG16’h1800128GFC AM Pattern 配置
PCS层寄存器FlexO_AM_CFG16’h1C00100G FlexO AM Pattern 配置
PCS层寄存器OTU50/OTU50U_AM_CFG16’h1D00OTU50 和 OTU50u AM Pattern 配置
PCS层寄存器OTU25/OTU25U_AM_CFG16’h1E00OTU25 和 OTU25u AM Pattern 配置
PCS层寄存器TX_PCS_RSFEC16’h3000 + K*16’h0080RS-FEC 模式下 PCS 发送通道配置和状态监控
PCS层寄存器RX_PCS_RSFEC16’h4000 + K*16’h0200RS-FEC 模式下 PCS 接收通道配置和状态监控
PCS层寄存器TX_PCS_BASE16’h6000NO-FEC/FEC(2112,2080) 模式下 PCS 发送通道配置和状态监控
PCS层寄存器RX_PCS_BASE16’h7000NO-FEC/FEC(2112,2080) 模式下 PCS 接收通道配置和状态监控
MAC层寄存器TX_MAC16’hA000 + K*16’h0200MAC 发送通道配置和状态监控
MAC层寄存器RX_MAC16’hC000 + K*16’h0200MAC 接收通道配置和状态监控

读这张表有三个要点。第一,地址都是 16'hXXXX 形式的 16 位地址,手册里每个寄存器的 Address 列都是”寄存器组基地址 + 组内偏移”里的偏移部分——比如 RX_MAC 的 LATCHED_INT 写着 16'h0008,实际地址是 16'hC000 + K*0x0200 + 0x0008第二,PCS 组里有两套并行的收发通道寄存器:带 RS-FEC 时用 TX/RX_PCS_RSFEC,不带 FEC(或用 2112/2080 FEC)时用 TX/RX_PCS_BASE,你的设计走哪条路就只看哪一套。第三,AM_CFG 按”协议+速率”分了七组(ETH 100G/50G/25G、128GFC、FlexO、OTU50、OTU25),工作在哪种协议就查对应那章,其他章节直接跳过。

通道号 K:基地址计算的关键变量

细心的你会发现表里反复出现一个变量 K(传输通道号)。CGMAC 在低速率模式下可以把一条大链路拆成多个小通道,K 就是你正在配的是第几个通道。手册给的规则是:

工作模式K 的取值
100G 以太网(RS-FEC 或 BA)K=0
50G(RS-FEC 模式)K=0, 2
50G(NO-FEC/FEC(2112,2080) 模式)K=0
40GK=0
25G / 10GK=0, 1, 2, 3

举个例子:工作在 25G RS-FEC 模式的通道 1,它的 RX_PCS_RSFEC 基地址 = 16'h4000 + 1*16'h0200 = 16'h4200,TX_MAC 基地址 = 16'hA000 + 1*16'h0200 = 16'hA200。而 TX_PCS_RSFEC 的步进和别家不一样,只有 16'h0080——通道 1 的 TX_PCS_RSFEC 基地址是 16'h3080 而不是 16'h3200。这种”同一批寄存器、不同组不同步进”的设计是这本手册最容易踩的坑,写驱动时建议把基地址计算封装成函数而不是手抄常量。

位域表格五列结构:手册的通用语言

全书 400 多个寄存器,每个都用同一种五列表格描述。看懂一张表,就看懂了所有表。以 RX_MAC 里的 FCS 控制寄存器为例(这是 MAC 收方向最常用寄存器之一):

AddressRegister NameDescription
16'h012CRX_MAC_FCS_CTLReceived FCS Control Register
Field BitsField NameTypeReset ValueDescription
31:3unusedRO0Unused
2FCS_INVERT_ENRW00: 4-byte FCS is checked against the regular calculated CRC value1: 4-byte FCS is checked against the inverted calculated CRC value
1FCS_CHECK_ENRW10: 4-byte FCS is not checked against the calculated CRC value1: 4-byte FCS is checked against the calculated CRC value and flagged with a packet error as is exits to the Client interface
0FCS_REMOVE_ENRW10: 4-byte FCS is not removed from data to client1: 4-byte FCS is removed from data and frame markers adjusted accordingly to client

五列的含义:

含义阅读要点
Field Bits该字段占寄存器 32 位中的哪几位2 表示单 bit 2;31:3 表示从 31 位到 3 位的一段
Field Name字段名,通常即见名知意同名前缀 + 编号(如 LANE_0~LANE_3)表示一组并列字段挤在同一个寄存器里
Type读写属性(见下一节)决定你能不能写它、写它会发生什么
Reset Value复位后的默认值默认值往往就是”推荐工作值”,很多位不需要动
Description功能描述英文原文,重点看 0:1: 两行,分别写明写 0 和写 1 的效果

表格上方还有两行头部信息:Address(组内偏移地址)和 Register Name,以及一句话的 Description 概述整个寄存器是干嘛的。一个寄存器恰好 32 位宽——把所有 Field Bits 的区间拼起来应该正好覆盖 [31:0],中间的空隙通常就是 unusedRESERVED

读写属性:RO、RW、RW1C、ROP 各是什么意思

Type 列的取值不多,但每个都事关操作正确性:

类型全称你能做什么典型出现位置
RO / R0Read Only只能读,写无效unused 填充位、硬件状态位
RWRead/Write可读可写,写什么就是什么几乎所有配置位
RW1CWrite 1 to Clear平时读的是锁存状态;写 1 把该位清 0,写 0 无效果中断锁存寄存器 LATCHED_INT
ROPRead Only Poll只读的统计计数器快照MAC 统计计数器 CNT 字段

三个最容易犯的错都跟 RW1C 有关。第一,清中断要写 1 不是写 0——想把 LATCHED_INT 的某位清掉,软件要向那一位写 1;顺手写 32'h0 全清是无效的。第二,RW1C 位和 RW 位混在同一个寄存器里时(很常见),写整个寄存器前要先读出原值,把 RW 位保持原样、只想清的 RW1C 位给 1,否则会把不想动的 RW 配置位改掉。第三,有的模块还提供”总清”开关,比如 LOCAL_INT_CNT_CTL 的 LATCHED_INT_CLEAR 位,它在”从 0 到 1 的跳变”瞬间清掉全部锁存位——也就是说连续写两次 1 不一定有第二次效果,要 0→1→0→1 地打拍。

ROP 计数器要成对读

MAC 统计计数器是 36 位(100G 及以下)或 48 位(200G 及以上),但寄存器只有 32 位宽,所以拆成 MSB/LSB 两个寄存器。先读 LSB 再读 MSB,两次读之间计数器还在走,拼出来可能差一点点——精确读取时通常连读两次 LSB 判断是否进位。

Reset Value:为什么默认值本身就携带信息

Reset Value 列不只是”告诉你上电是几”,它往往直接暴露了推荐配置。几个例子:

  • TX_MAC MAIN_CTL1 的 PREAMBLE_INS_EN 默认 1——前导码插入默认就开着,你不用动;
  • 同一寄存器的 AVERAGE_IPG 默认 0,对应平均帧间隔 12 字节(IEEE 802.3 标准 IPG);写成 1 会缩到 8,且只在 ≤400G 模式下支持;
  • FORCE_LFI/FORCE_RFI 默认都是 0,手册特别提醒两个只能开一个,都开行为未定义;
  • RESET_CTRL 的 CORE_DP_RESET 等 4 个复位位默认 0(不复位),但 SERDES_HANDLER_CTRL 的 TX/RX_SER_HNDLR_RESET 默认却是 1(复位保持)——说明 SerDes handler 侧上电后需要软件显式拉出复位。这两处默认值方向相反,是流程类配置最容易漏的地方。

读手册时建议拿荧光笔把所有”默认值 ≠ 直觉”的位标出来,这些就是调试时最值得第一眼确认的位。

RESERVED、unused、SPARE:三类”别碰”的位怎么区分

每张表里都有大量”看起来没用”的字段,它们分三种,处理方式不同:

字段名Type含义处理方式
unusedRO功能未实现,读恒 0直接忽略
RESERVEDRW保留位,但物理上可写保持默认值,不要改——手册明确写 “Reserved - Do Not Touch”
SPARE_xRW厂商预留的备用的寄存器空间保持默认值,除非 FAE 明确指示

特别注意 RESERVED 虽然标成 RW,但它是设计者给自己留的余地,不是给你用的。有些 RESERVED 字段还有非零默认值(比如 TX_MAC MAIN_CTL1 的 [13:6] 默认 8'd16),说明这些位背后接了实际的硬件行为——擅自清零可能直接打断数据通路。

寄存器族规律:一份模板管几百个寄存器

这本手册 400 多个寄存器,真正”独立”的其实不到 100 个,其余都是同模板复制的”寄存器族”。识别出族规律,手册能薄一半:

AM marker 族:ETH_100G/50G/25G_AM_CFG、TX/RX_PCS_BASE 的 AM 部分全是同一个模板——每个 lane 两个 24 位 MARKER 寄存器(AM_LNx_M2_M1_M0AM_LNx_M6_M5_M4),字段永远是 [23:0] MARKER RW,区别只是默认的 AM 码字不同。比如 TX 侧 100G 的 AM_LN0_M2_M1_M0 默认 24'h2168c1,而手册特别注明”默认值对应 100GE,50G/40G 应用需要重新编程”——同一套寄存器换速率要换码字,这是族规律之外必须记住的例外。100G 有 20 个 lane(LN0~LN19),所以一章里 40 个寄存器其实只是一句话的事。

BIP/误码计数族:RX_PCS_RSFEC 的 BIP_ERR_CNT_LN0LN19、FEC 符号错误直方图 FEC_HISTO_SYMB_ERR0~14 等,全是”同一字段名 + lane 序号”的复制,读法完全一致。

MAC 统计族:TX_MAC/RX_MAC 各有约 45 个统计计数器,全部长成 [31:16] unused RO + [15:0] CNT ROP(MSB 寄存器)或 [31:0] CNT ROP(LSB 寄存器)的样子,只是统计对象不同——按帧长分 64B、65127B、128255B……一直到 9601B 以上共 13 档,按帧类型分 unicast/multicast/broadcast/pause 等。

通关自测

以下问题能不翻书答出来,说明这一篇的目标达成了: