这一篇在干嘛?

这是 UG1117 系列的第 2 篇。第一篇建立了地址地图和位域表格的读法,这一篇沿着”上电 → 复位 → 时钟 → 系统配置 → PCS → MAC → 中断/统计”的实际配置顺序,挑出每个环节真正常用的关键寄存器讲透。手册里同名寄存器(如 MAIN_CTL1、LATCHED_INT)在多个模块重复出现,本文讲清一个模块的套路,其余模块举一反三。同系列第 1 篇见 全景地图与阅读方法

第一步:复位——谁默认在复位里,谁默认在工作

第二步:时钟门控——SW_CLK_GATE_CONFIG 的通道开关

第三步:COMMON_CFG 系统配置——PM tick、带宽、AM 门限

AM 对齐标记:一族只改默认值的寄存器

PCS 层控制:加扰、MUX 与 BIP 误码监控

TX_MAC:帧发送与前导码/IPG 控制

流控三件套:PAUSE、PFC 与 VLAN TPID

RX_MAC:接收控制与 FCS 处理

中断机制:LATCHED_INT + INT_MASK + INT_EN 三级体系

统计计数器:MSB/LSB 成对读与 1 秒告警窗口

第一步:复位——谁默认在复位里,谁默认在工作

CGMAC 的复位控制分散在两个寄存器组里,而且默认值方向相反,这是整个配置流程的第一道坎。

RESET_CTRL(基地址 16’h0000) 里的 CPU_CONTROL 管 core 侧复位。四个复位位、两种作用对象——数据通路(DP)和寄存器映射(REGMAP)分开复位,互不影响:

AddressRegister NameDescription
16'h0000CPU_CONTROLSOC main control register
Field BitsField NameTypeReset ValueDescription
31CORE_DP_RESETRW1'd0NOTE: This bit only affects only the Core datapath and alarm/defect/counters logic. This does not affect the system side regmap control RW registers.0: Core datapath logic active1: Core datapath logic in reset
30CORE_REGMAP_RESETRW1'd0NOTE: This bit only affects the Core control regmap control RW registers. This does NOT affect the Core datapath logic.0: core regmap active1: core regmap in reset
29SERDES_HANDLER_DP_RESETRW1'd0NOTE: This bit only affects only the Serdes Handler datapath and alarm/defect/counters logic. This does not affect the system side regmap control RW registers.0: Serdes handler datapath logic active1: Serdes handler datapath logic in reset
28SERDES_HANDLER_REGMAP_RESETRW1'd0NOTE: This bit only affects the Serdes Handler regmap control RW registers. This does NOT affect the Core datapath logic.0: Serdes handler regmap active1: Serdes handler regmap in reset
[27:8]unusedRO0Unused
[7:4]RESERVEDRW4'hfReserved - Do Not Touch
[3:0]RESERVEDRW4'hfReserved - Do Not Touch

SERDES_HANDLER_CTRL(基地址 16’h0100) 的 SERDES_HANDLER_CONTROL 则相反:TX_SER_HNDLR_RESETRX_SER_HNDLR_RESET 默认值是 1——SerDes handler 侧上电后默认保持在复位态,需要软件显式写 0 拉出。

COMMON_CFG 里的 RESET_CONFIG(16’h0128,v1.1 更新过) 管的是 PCS 各数据通路的复位,并且有一条必须记住的依赖关系:TX/RX_RESET_BA(BA PCS 复位)与 TX/RX_RESET_RSFEC_CH0/CH1TX/RX_RESET_RSFEC_CH2/CH3 三组位必须同时拉复位或同时释放——100G/50G BA 模式要求前两组同步,10G/25G BA 模式要求三组全部同步。只释放其中一个会让部分通路卡在复位里,表现为链路完全不通。

复位依赖速查

  • 100G BA / 50G BA:RESET_BA 与 RESET_RSFEC_CH0/CH1 成对操作
  • 10G BA / 25G BA:RESET_BA + RESET_RSFEC_CH0/CH1 + RESET_RSFEC_CH2/CH3 三者同步
  • 数据通路复位(_DP_RESET)不会动寄存器配置,寄存器复位(_REGMAP_RESET)不会动数据通路——调试时想”软复位数据但保留配置”,选 DP 位。

第二步:时钟门控——SW_CLK_GATE_CONFIG 的通道开关

SW_CLK_GATE_CONFIG(16’h0130,v1.1 更新)是上电流程里容易漏的一步:各数据通路的时钟默认是关断的(全部默认 0),要把用到的路径显式使能:

Field BitsField NameTypeReset Value说明
17SW_CLK_GATE_RSFEC_CH2/CH3RW1’b0CH2/CH3 RS-FEC 时钟使能(MAC Client + RS-FEC 或 66b Client + RS-FEC 路径需开)
16SW_CLK_GATE_RSFEC_CH0/CH1RW1’b0CH0/CH1 RS-FEC 时钟使能(同上)
12SW_CLK_GATE_BARW1’b0BA(非 FEC)PCS 时钟使能
3SW_CLK_GATE_COMMON_CH2/CH3RW1’b0CH2/CH3 公共时钟(MAC 与 PCS glue)使能
2SW_CLK_GATE_COMMON_CH0/CH1RW1’b0CH0/CH1 公共时钟使能

规则很简单:你的数据走哪条路(MAC Client + RS-FEC、66b Client + RS-FEC、还是非 FEC 的 BA 路径),就把对应的 RS-FEC/BA 位和 COMMON 位都置 1。链路完全没动静时,先查这几个位是不是没开。

第三步:COMMON_CFG 系统配置——PM tick、带宽、AM 门限

COMMON_CFG(基地址 16’h0200)共 39 个寄存器,是全局参数最密集的一章,挑四个最常用的。

PM_TICK_PERIOD(16’h000C) 决定性能监控统计的刷新节拍,默认 32’d1_000_000_000 个 core 时钟周期(v1.1 修订过此节描述)。所有 MAC 统计计数器按这个节拍出快照,想让统计更新更快就把它改小。

MAC_IF_BW_SEL(16’h0148) 选择 MAC 客户接口每个 Port 的数据位宽,用 one-hot 编码:8'h8=256bit、8'h4=128bit、8'h2=64bit、8'h1=32bit,Port 0 还支持 320bit(8’h10)和 512bit(8’h20)。它和 REUSE_IF_BW_SEL(复用接口位宽,66b/OTN/FlexE 等场景)一起决定了用户侧接口的物理宽度。

AM_LOCK_CFG_0 / AM_OOLOCK_CFG_0(16’h0160 / 16’h0170) 配 RS-FEC 通路每个逻辑 lane 的 AM 锁定/失锁门限:锁定为每 lane 4 位默认 2(连续 2 个 AM 匹配即锁定),失锁默认 5。AM(Alignment Marker)是多 lane 以太网对齐的锚点,lane 间偏移补偿(deskew)全靠它;门限调小锁得快但易误锁,调大稳但慢。

AM_FACTOR_SIM(16’h0010) 是仿真专用寄存器,能把 AM 周期加速 2~64 倍缩短仿真时间。手册原话:非 0 值仅用于 debug/仿真,生产系统不要碰。

AM 对齐标记:一族只改默认值的寄存器

七组 AM_CFG 章(ETH 100G/50G/25G、128GFC、FlexO、OTU50、OTU25)结构完全一样:每个 lane 两个 24 位 marker 寄存器。看 100G 的代表:

AddressRegister NameDescription
16'h0020AM_LN0_M2_M1_M0TX AM marker 0a register (100G/50G/40G)
Field BitsField NameTypeReset ValueDescription
[31:24]unusedRO0Unused
[23:0]MARKERRW24'h2168c1AM_LN0_M2_M1_M0. The default value is for 100GE. 50G/40G application need to be re-programmed.

族规律:字段永远是 [23:0] MARKER RW,唯一变化的是默认码字。关键例外藏在 Description 里——默认值对应 100GE,跑 50G/40G 必须重新编程整组 marker。这正是一篇只讲一个代表 + 点明例外的原因:100G 章有 40 个这样的寄存器(20 个 lane × 2),逐个罗列毫无意义。RX 侧(RX_PCS_BASE 的 AM_LNx 系列,地址从 16’h02A0 起)结构相同,存的是接收侧期望匹配的 AM 码字。FlexO/OTU 章还多出 UM(unique marker)、UP、CP 等变体字段,套路一致:一个 lane 一组、默认值即协议规定码字。

PCS 层控制:加扰、MUX 与 BIP 误码监控

PCS 收发各有一个主控制寄存器,NO-FEC/BA 路径用 TX/RX_PCS_BASE(16’h6000/16’h7000),RS-FEC 路径用 TX/RX_PCS_RSFEC(16’h3000+K0x80 / 16’h4000+K0x200)。

TX_PCS_CTL1(TX_PCS_BASE 第一个寄存器) 的核心位:SCRAMBLE_EN(bit 2,默认 1,PCS 加扰使能)、PCS_MUX[6:3](bit 对应通道,1=FCFEC 逻辑禁用默认、0=使能)、BIP3_MASK_EN(bit 15,100G/50G/40G 的 BIP3 掩码,默认开)。RX_PCS_CTL1 对称:DESCRAMBLE_EN(bit 2,默认 1)+ 同样的 PCS_MUX。PCS_MUX 是”选 BA 还是 FCFEC 数据通路”的开关,必须与你的 FEC 模式一致。

接收侧最重要的状态是 BIP 误码计数:RX_PCS_CTL2 的 BIP_ERR_CNT_LIMIT(默认 16’h000f)设定告警门限;每个 lane 的 BIP_ERR_CNT_LNx 递增计数,配合 RX_PCS_LATCHED_INT 的 HI_BER 位形成”误码超限 → 锁存中断”的监控链。RS-FEC 路径还有更细的一套:FEC_COR_CW_CNT/FEC_UNCOR_CW_CNT(纠错/无法纠错码字计数)、DEGRADED_SER_ACT/DEACT_THRES(劣化误码率进出门槛)、RX_PCS_HI_BER_THRES/WINDOW(高误码告警的阈值与窗口)。

TX_MAC:帧发送与前导码/IPG 控制

TX_MAC 基地址 16’hA000+K*0x200,第一个寄存器 MAIN_CTL1 汇总了发送方向的主要开关:

Field BitsField NameTypeReset Value作用
23FAULT_REFLECTION_ENRW1RX 收到 Local Fault 时向 MII 发 Remote Fault;收到 Remote Fault 则发 Idle
20ENABLE_LEN_CHKRW1检查帧 type/length 字段合理性(46~1500、VLAN 帧 42/38 起)
14PREAMBLE_INS_ENRW1前导码插入使能
5FAULT_PATTERN_TYPERW1故障码型选择:0=Clause 84(40G+,8 字节边界)、1=Clause 49(25G 及以下,4 字节边界)
3AVERAGE_IPGRW0平均帧间隔:0=12 字节(IEEE 标准)、1=8 字节(仅 ≤400G)
2FORCE_LFIRW01=持续发送 LFI 有序集(与 FORCE_RFI 互斥)
1FORCE_RFIRW01=持续发送 RFI 有序集(与 FORCE_LFI 互斥)

调试常用小技巧:FORCE_LFI/FORCE_RFI 可以人为向线路注入故障码型,用来验证对端设备的故障传递行为;FAULT_PATTERN_TYPE 必须与速率匹配,25G 及以下用 Clause 49。帧长上下限由 TX_MAC_MIN_PKT_THRES / MAX_PKT_THRES(默认 64 / 9215 字节)设定,越界帧计入统计并标记错误。

流控三件套:PAUSE、PFC 与 VLAN TPID

经典 PAUSE:TX_MAC_PAUSE_SRC_ADDR47_32/31_0 设源 MAC(默认 0),注意这个值还兼职过滤收到的单播 PAUSE 帧;PAUSE_DEST_ADDR 默认 32'hc2000001 + 16'h0180,拼起来正是 IEEE 规定的多播 PAUSE 地址 01:80:C2:00:00:01;PAUSE_QUANTA(16’h0148)写暂停时间(0~65535 个时隙)。

PFC(优先级流控,802.3 Annex 31D):TX_MAC_PFC_PRI_CTL 的 PRIORITY_EN[7:0] 按 bit 使能 8 个优先级;TX_MAC_PFC_TIME_VECTOR_0_1 ~ 6_7 四个寄存器每 32 位装两个 16 位 time 值,对应 time[0]~time[7]。

VLAN TPID:TX/RX_MAC 各有一组(地址 16’h01C0~01D0):VLAN_CTRL 用两个 4 位 bitmap(SVLAN_BMP/CVLAN_BMP)使能 4 个可编程 TPID;SVLAN TPID 默认 0x88A8、CVLAN 默认 0x8100,均为 IEEE 标准值;手册提醒 TPID 编程值应大于 0x600(IEEE 对负载长度字段的下限),否则会被当成长度字段。

RX_MAC:接收控制与 FCS 处理

RX_MAC 基地址 16’hC000+K*0x200。MAIN_CTL1 的结构与 TX 侧对称:PREAMBLE_REMOVE_EN(bit 14,默认 1,剥前导码)、ENABLE_LEN_CHK(bit 20,默认 1)、FAULT_PATTERN_TYPE(bit 5,默认 Clause 49)、INT_EN 在 MAIN_CTL2(bit 0,默认 0——中断总开关默认是关的)。

接收方向最核心的是 FCS 三开关 RX_MAC_FCS_CTL(16’h012C,默认值本身就说明了推荐行为):

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

默认行为是”校验 FCS 并从数据中剥离”——标准以太网接收流程。FCS_INVERT_EN 用于个别 PHY 输出反码 CRC 的非标场景。帧长统计口径由 RX_MAC_MIN/MAX_PKT_THRES(默认 64 / 9215)划定,underrun/oversize/runt/jabber 等错误帧分类全依赖这两个门限。

中断机制:LATCHED_INT + INT_MASK + INT_EN 三级体系

从 SERDES_HANDLER_CTRL 到 TX/RX_MAC,每个模块的中断都是同一个三级套路,学会一处即会全部:

  1. INT_EN(总开关):各模块 MAIN_CTL2 的 bit 0,默认 0。不开它,所有(未屏蔽的)中断都不会上报。
  2. INT_MASK(屏蔽字):每个 bit 对应一个中断源,1=允许上报、0=屏蔽,默认全 0(全屏蔽)。RX_MAC 的 INT_MASK(16’h000C)包含 ABORT_ERR_EN、IDLE_ERR_EN、PM_TICK_EN、BAD_FCS_CNT_OL_EN、RX_RF_EN 等。
  3. LATCHED_INT(锁存状态):故障发生即锁存为 1,保持到软件清除。类型是 RW1C——写 1 清除对应位;另外各模块的 LOCAL_INT_CNT_CTL(16’h0014)提供两个总清开关:LATCHED_INT_CLEAR(bit 1)和 CNT_CLEAR(bit 0),都在 0→1 跳变瞬间生效。

以 RX_MAC 的 LATCHED_INT(16’h0008)为例,常见故障位有:ABORT_ERR(bit 18,包传输中收到 FE CTRL 码型导致包终止)、IDLE_ERR(bit 17,包传输中收到 IDLE 码型)、PM_TICK(bit 15,性能监控节拍中断)、BAD_FCS_CNT_OL / BAD_FRM_CNT_OL(bit 14/12,坏 FCS/坏帧计数越限告警)。RS-FEC 侧的对应版本(RX_PCS_RSFEC LATCHED_INT,16’h0008)则覆盖 HI_BER、FEC_DEG_SER(劣化误码率)、BIP_ERR、DESKEW_ALIAS、AM_OOLOCK、AM_LOCK 等链路级事件——链路忽通忽断时先看 AM_LOCK/AM_OOLOCK 这对位。

清中断的正确姿势

① 先读 LATCHED_INT 判断故障源;② 向想清的位写 1(RW1C),不要写全 0;③ 若用总清位,注意 0→1 跳变才生效;④ 清之前最好把故障原因(配合统计计数器)记录下来,锁存位一旦清掉就没有痕迹了。

统计计数器:MSB/LSB 成对读与 1 秒告警窗口

TX/RX_MAC 各有约 45 个统计计数器,全部是 ROP 类型(只读快照)。它们按两个维度分类:

按帧类型:TOTAL/GOOD/ERROR 帧、字节(BYTE_CNT 48 位)、单播/多播/广播/PAUSE 帧、XON PAUSE(quanta>0)/XOFF PAUSE(quanta=0)。

按帧长分档:64B、65127B、128255B、256511B、5121023B、10241518B、15191522B、15231548B、15492047B、20484095B、40968191B、8192~9600B、9601B 以上,共 13 档。每档都是 MSB/LSB 一对寄存器,如 RX_MAC_64B_FRM_CNT_MSB(16’h0050)/ LSB(16’h0054)。

计数器位宽与速率挂钩:100G 及以下 36 位、200G 及以上 48 位;MSB 寄存器固定格式 [31:16] unused RO + [15:0] CNT ROP,LSB 是 [31:0] CNT ROP。拼接公式:计数值 = (MSB.CNT << 32) | LSB.CNT,再按位宽截取有效位。

错误帧细分:CRC_ERR(FCS 错)、UNDERSIZE(短于门限但 CRC 对)、RUNT(短且 CRC 坏)、OVERSIZE(超长但 CRC 对)、JABBER(超长且 CRC 坏)、MISALIGNMENT(错位帧)。排障时这一组是最先看的”体检报告”:CRC_ERR 增长多半是链路误码,RUNT/JABBER 成堆则可能是对端故障或协商问题。

越限告警窗口:RX_MAC_FCS_FRM_CTL/MA_FRM_CTL/FRM_CTL 三对 MSB/LSB 寄存器设定坏 FCS、错位、坏帧的计数上限(LSB 默认 32’d16,MSB 高 16 位默认 0);RX_MAC_LIMIT_THRESHOLD(16’h0128)设定判定窗口,默认 32’h3B9ACA00,即时钟 1GHz 下的 1 秒。含义是:1 秒窗口内任一类错误帧数超过上限,对应中断(BAD_FCS_CNT_OL 等)触发;窗口到期计数自动清零、重新开窗。时钟频率变化时记得按 窗口值 = 频率(Hz) × 秒数 换算重写。

最后别忘了 LOCAL_INT_CNT_CTL 的 CNT_CLEAR(写 1、0→1 跳变生效)可以一次清空模块内全部统计计数器——做吞吐测试前后各清一次,读到的就是干净的区间数据。

通关自测