这一篇在干嘛?
这是 UG1117 系列的第 2 篇。第一篇建立了地址地图和位域表格的读法,这一篇沿着”上电 → 复位 → 时钟 → 系统配置 → PCS → MAC → 中断/统计”的实际配置顺序,挑出每个环节真正常用的关键寄存器讲透。手册里同名寄存器(如 MAIN_CTL1、LATCHED_INT)在多个模块重复出现,本文讲清一个模块的套路,其余模块举一反三。同系列第 1 篇见 全景地图与阅读方法。
第二步:时钟门控——SW_CLK_GATE_CONFIG 的通道开关
第三步:COMMON_CFG 系统配置——PM tick、带宽、AM 门限
中断机制:LATCHED_INT + INT_MASK + INT_EN 三级体系
第一步:复位——谁默认在复位里,谁默认在工作
CGMAC 的复位控制分散在两个寄存器组里,而且默认值方向相反,这是整个配置流程的第一道坎。
RESET_CTRL(基地址 16’h0000) 里的 CPU_CONTROL 管 core 侧复位。四个复位位、两种作用对象——数据通路(DP)和寄存器映射(REGMAP)分开复位,互不影响:
| Address | Register Name | Description | ||
| 16'h0000 | CPU_CONTROL | SOC main control register | ||
| Field Bits | Field Name | Type | Reset Value | Description |
| 31 | CORE_DP_RESET | RW | 1'd0 | NOTE: 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 |
| 30 | CORE_REGMAP_RESET | RW | 1'd0 | NOTE: 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 |
| 29 | SERDES_HANDLER_DP_RESET | RW | 1'd0 | NOTE: 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 |
| 28 | SERDES_HANDLER_REGMAP_RESET | RW | 1'd0 | NOTE: 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] | unused | RO | 0 | Unused |
| [7:4] | RESERVED | RW | 4'hf | Reserved - Do Not Touch |
| [3:0] | RESERVED | RW | 4'hf | Reserved - Do Not Touch |
SERDES_HANDLER_CTRL(基地址 16’h0100) 的 SERDES_HANDLER_CONTROL 则相反:TX_SER_HNDLR_RESET 和 RX_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/CH1、TX/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 Bits | Field Name | Type | Reset Value | 说明 |
|---|---|---|---|---|
| 17 | SW_CLK_GATE_RSFEC_CH2/CH3 | RW | 1’b0 | CH2/CH3 RS-FEC 时钟使能(MAC Client + RS-FEC 或 66b Client + RS-FEC 路径需开) |
| 16 | SW_CLK_GATE_RSFEC_CH0/CH1 | RW | 1’b0 | CH0/CH1 RS-FEC 时钟使能(同上) |
| 12 | SW_CLK_GATE_BA | RW | 1’b0 | BA(非 FEC)PCS 时钟使能 |
| 3 | SW_CLK_GATE_COMMON_CH2/CH3 | RW | 1’b0 | CH2/CH3 公共时钟(MAC 与 PCS glue)使能 |
| 2 | SW_CLK_GATE_COMMON_CH0/CH1 | RW | 1’b0 | CH0/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 的代表:
| Address | Register Name | Description | ||
| 16'h0020 | AM_LN0_M2_M1_M0 | TX AM marker 0a register (100G/50G/40G) | ||
| Field Bits | Field Name | Type | Reset Value | Description |
| [31:24] | unused | RO | 0 | Unused |
| [23:0] | MARKER | RW | 24'h2168c1 | AM_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 Bits | Field Name | Type | Reset Value | 作用 |
|---|---|---|---|---|
| 23 | FAULT_REFLECTION_EN | RW | 1 | RX 收到 Local Fault 时向 MII 发 Remote Fault;收到 Remote Fault 则发 Idle |
| 20 | ENABLE_LEN_CHK | RW | 1 | 检查帧 type/length 字段合理性(46~1500、VLAN 帧 42/38 起) |
| 14 | PREAMBLE_INS_EN | RW | 1 | 前导码插入使能 |
| 5 | FAULT_PATTERN_TYPE | RW | 1 | 故障码型选择:0=Clause 84(40G+,8 字节边界)、1=Clause 49(25G 及以下,4 字节边界) |
| 3 | AVERAGE_IPG | RW | 0 | 平均帧间隔:0=12 字节(IEEE 标准)、1=8 字节(仅 ≤400G) |
| 2 | FORCE_LFI | RW | 0 | 1=持续发送 LFI 有序集(与 FORCE_RFI 互斥) |
| 1 | FORCE_RFI | RW | 0 | 1=持续发送 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,默认值本身就说明了推荐行为):
| Address | Register Name | Description | ||
| 16'h012C | RX_MAC_FCS_CTL | Received FCS Control Register | ||
| Field Bits | Field Name | Type | Reset Value | Description |
| 31:3 | unused | RO | 0 | Unused |
| 2 | FCS_INVERT_EN | RW | 0 | 0: 4-byte FCS is checked against the regular calculated CRC value1: 4-byte FCS is checked against the inverted calculated CRC value |
| 1 | FCS_CHECK_EN | RW | 1 | 0: 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 |
| 0 | FCS_REMOVE_EN | RW | 1 | 0: 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,每个模块的中断都是同一个三级套路,学会一处即会全部:
- INT_EN(总开关):各模块 MAIN_CTL2 的 bit 0,默认 0。不开它,所有(未屏蔽的)中断都不会上报。
- 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 等。
- 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 跳变生效)可以一次清空模块内全部统计计数器——做吞吐测试前后各清一次,读到的就是干净的区间数据。
通关自测
上电后想软复位 core 数据通路但保留所有寄存器配置,该写哪个位?
RESET_CTRL 的 CPU_CONTROL bit 31(CORE_DP_RESET)写 1 再写 0。数据通路复位(DP)与寄存器复位(REGMAP)是独立的两套,只动 DP 位不影响 RW 寄存器内容。
25G BA 模式下只释放 TX_RESET_BA 会发生什么?
违反复位同步依赖:10G/25G BA 要求 TX_RESET_BA、TX_RESET_RSFEC_CH0/CH1、TX_RESET_RSFEC_CH2/CH3 三组同时动作,只释放 BA 会让 RS-FEC 通路仍处于复位,链路不通。
链路反复失锁,应该先看哪一对中断位?
RS-FEC 侧 LATCHED_INT 的 AM_LOCK / AM_OOLOCK 位,配合 AM_LOCK_CFG_0/AM_OOLOCK_CFG_0 的门限。AM 锁定/失锁门限(默认 2/5)直接决定 lane 对齐的灵敏度。
读完 RX_MAC_64B_FRM_CNT_LSB 再读 MSB,拼出的计数为什么会偏大?怎么避免?
两次读之间计数器仍在递增,若 LSB 读取后发生进位到 MSB,拼接值会偏大。避免方法是连读两遍 LSB:若第二次比第一次小(回绕)或差异异常,重读整对。
时钟是 900MHz 时,要把 RX_MAC_LIMIT_THRESHOLD 配成 1 秒窗口,该写多少?
手册给出换算:900MHz × 1s = 0x362FA05D(1GHz 时才是默认的 0x3B9ACA00)。窗口值 = 时钟频率 × 期望秒数。