这一篇在干嘛?
系列第 2 篇(第 1 篇:手册读法与 Common/RX)。本篇覆盖 UG1121 后三章:TX 发送寄存器(驱动器摆幅、FIR 预加重、速率/复位控制)、ETH 以太网自协商寄存器、DFX 调试设施寄存器,最后串一条”链路出问题→查哪个寄存器”的实战路径。
DFX 寄存器:调试总线、环回与 SOC 接口(第 5 章)
TX 发送寄存器:驱动器、FIR 与速率控制(第 3 章)
第 3 章(Base 0x02001000)与 RX 章完全镜像:afe_* 是模拟前端、rst_afe_tx/rst_dbe_tx 是复位 override、pd_afe_tx 是掉电 override、txmfsm_* 是 TX 主状态机指针。重点认识三组:
① 端接校准 override:afe_octerm_tx(0x0)。正常情况下 TX 端接阻抗由端接校准状态机控制,这个寄存器就是手动接管入口:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x0[13] | termcal_chop_nt | rw | 0x0 | 斩波信号:允许用两种比较器极性做校准。1 标准极性 / 0 反极性 |
| 0x0[12:7] | ref_res_nt | rw | 0x0 | TX 参考电阻校准码 |
| 0x0[6:1] | slice_ena_nt | rw | 0x3f | 端接控制:d’0 阻抗最大 ~ d’8 阻抗最小(大于 d’8 无效),默认全开 |
| 0x0[0] | bypass_ena_a | rw | 0x1 | 1 - 寄存器 override 使能 |
配套只读寄存器 afe_octerm_tx_rdreg(0x4)回读 termcal_error_nt——TX 切片阻抗校准的误差信号,判断端接校准收敛与否就看它。
② 发送 FIR(预加重/去加重):fir(0x50)是整个 TX 信号质量的核心。手册在描述里加了一句很重的警告:这些不是 SOC 语义下的系数,如果你想设 C(-1)/C(1) 系数,不要用这个寄存器(应走 SOC 接口的 ictl_tx_fir 信号,对应 DFX 章的 override 位):
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x50[22] | ovr_en_a | rw | 0x0 | AFE 信号 override 使能。0 正常 / 1 寄存器接管 |
| 0x50[21:0] | val_a | rw | 0x0 | TX FIR 抽头系数:C(1)[21:17]、C(0)[16:11]、C(-1)[10:6]、C(-2)[5:3]、C(-3)[2:0] |
五个抽头的布局一目了然:C(0) 是主抽头,C(1)/C(-1) 是一阶前标/后标,C(-2)/C(-3) 是二阶/三阶后标。调预加重本质上就是在改这 22bit 的分配。周边还有 tx_fir_rdreg(回读)、tx_fir_reg14/reg18(扩展配置)。
③ 速率与复位/时钟控制:rate_cntrl_tx(0x5c)只有 4bit 但决定 TX 位时钟后分频:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x5c[3:0] | postdiv_nt | rw | 0x4 | TX 位时钟后分频:100 - div16 / 011 - div8 / 010 - div4 / 001 - div2 / 000 - div1(111~101 无效) |
rst_afe_tx(0x60)把 TX 模拟通路按块列了 8 个复位位(driver、p2s 并串转换、postdiv、直接合成器、DCO……),注意它的语义是 1 = 正常、0 = 复位;rst_dbe_tx(0x64)则覆盖数字侧 12 个块(DPLL、相位 FIFO、SSCM、数据通路等),语义同样如此。switchclk_dbe_tx(0x6c)是各测量/时钟块的时钟源与分频选择,里面有个实用位 ref_freq_sel_nt:0 = PCIe 100MHz 参考时钟、1 = 25MHz。改任何分频都要遵守配套 seq_cntrl_tx 里的 ready 握手(postdiv_ready_a、ds_synth_div_ready_a)。
TX 章还有环回相关寄存器(tx_loopback_cntrl 及其 rdreg、tx_fep_loopback_fifo_top),以及与 RX 章同名的电源 override pd_afe_tx(12 个掉电位,默认全部由电源状态机托管,1 = 正常运行、0 = 该块掉电)。
常见坑:直接写
fir寄存器去"调预加重"
fir(0x50)的描述明确警告:这个寄存器的位排布与 SOC 接口语义的 C(-1)/C(1) 系数不一致,正常配置请走 SOC/MSS 接口(TD IP 参数或 ictl_tx_fir 信号),寄存器只用于底层调试。直接改它很容易和接口配置互相覆盖——先看 DFX 章lane_txfir_ovrd_en_a是否已被置位。
ETH 寄存器:以太网自协商 ANLT(第 4 章)
第 4 章(Base 0x02002000)实现 IEEE 以太网的自动协商(Auto-Negotiation, AN)和链路训练(Link Training, LT),寄存器命名统一为 eth_an_* / eth_anlt_*。分四堆:
① 本端能力通告:eth_an_adv_ability_reg1~3(0x0/0x4/0x8)。每个寄存器装一个 16bit 链路码字,reg1 的位定义直接对应 Clause 73 的 Config_Reg[15:0]:[4:0] Selector、[9:5] 回显 nonce、[12:10] Pause 能力、[13] RF(Remote Fault)、[14] Ack(内部生成)、[15] NP(Next Page);reg2 是 [4:0] 发送 nonce + [15:5] Technology Ability 字段。手册特别提醒:这些值要在 eth_an_tr_disable 的上升沿后尽快写入,协商过程才会把本端能力发出去。
② 对端能力与本端控制:eth_an_lp_adv_ability_reg1~3(0x1c~0x24,Link Partner 即对端通告的镜像寄存器)、eth_an_ctrl(0xc)与 eth_an_ctrl_reg1~3。eth_an_ctrl 里值得认识的位:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0xc[27] | rsfec_int_port_en_nt | rw | 0x0 | 使能后 octl_eth_an_rs_fec_ena 指示 100GBASE-K/CR1 PHY 的交织 FEC 已开启 |
| 0xc[26] | noncegen_en_nt | rw | 0x0 | 使能 TX nonce 自动生成。初始 nonce 不自动生成,须先编程为非零值 |
| 0xc[25] | autoack_en_nt | rw | 0x0 | 保留 |
| 0xc[24] | a22en | rw | 0x0 | 保留 |
eth_an_ctrl_reg1(0x10)里是重启协商的扳机:an_mr_restart_negotiation(bit9)写 1 复位自协商并把仲裁 FSM 拉回 ENABLE 态——手册注释说状态切换可能较慢,因为 PMA 忙(状态迁移、RX 评估中)时 FSM 不能切换。
③ Next Page 与新标准扩展:eth_an_np_reg1~3(0x340x3c,Next Page 码字)、0x30,新以太网标准配置)。eth_an_newdef_reg1~3(0x28
④ ANLT 与 PMA 的桥:eth_an_pma_def_reg1~3(0x400x48,自协商用的 PMA 控制默认值)、0x98)与 eth_anlt_rate_reg1~3(0x90eth_anlt_width_reg1~4(0xa8~0xb4)——链路训练期间协商出的速率/位宽会落到这些寄存器上驱动 RX/TX 状态机。第 1 篇讲过的 RX 侧 anlt_mon 寄存器可以抓下协商双方实际收发的 Clause 72/92 或 136/162 帧,配合本章寄存器就能完整复盘一次协商。
DFX 寄存器:调试总线、环回与 SOC 接口(第 5 章)
第 5 章(Base 0x02003000)是 Design-for-Debug 设施,三块内容:
① 调试总线与信号观测:ctl_dbe_pllcharz(0x0)能把内部时钟引到 TX 焊球上观测,也能让 TX 焊球观测内部模拟信号:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x0[5:2] | clksel_a | rw | 0x0 | 时钟观测选择:1/2 内部/外部 RX 时钟,3 RX refdiv,4 RX synthdiv,5/6 内部/外部 TX 时钟,7 TX refdiv,8 TX synthdiv,0 关闭 |
| 0x0[1] | atest_ena_a | rw | 0x0 | 1 - TX 焊球用于观测内部模拟信号 |
| 0x0[0] | tx_ena_a | rw | 0x0 | 1 - TX 焊球用于观测内部时钟 |
ctl_dbe_tbus(0x4)配置 Trace/调试总线:选择 ATEST/TX 的 client 与 bit、使能并复位内部调试计数器;dat_dbe_tbus(0xc)回读调试计数器值。
② SOC 侧接口的 override/观测对:dig_soc_lane_ovrd_reg1~8 与 dig_soc_lane_stat_reg1~3。这对寄存器把 SOC/MSS 接口上的所有 lane 控制信号(复位、速率、位宽、FIR、环回、边带扫描 margin……)变成”寄存器可接管 + 寄存器可观测”。以 dig_soc_lane_ovrd_reg5(0x28)为例,它是总开关排:bit21 接管 digref、bit20 接管 block_data_ena、bit19 接管环回请求、bit18 接管 RX margin 扫描、bit14/13 分别接管 TX/RX 状态(power/rate/req/width)……dig_soc_lane_stat_reg1(0x38)则把 octl_* 观测信号(如 octl_rx_data_vld、octl_loopback_ack、octl_eth_an_done)集中起来回读——调试时”软件以为的状态”和”硬件实际的状态”就靠这组 stat 寄存器对账。
③ 环回控制:loopback_cntrl(0x44)一个寄存器集齐全部环回路径:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x44[6] | ena_nt | rw | 0x0 | 环回 override 总使能。0 正常 / 1 接管 |
| 0x44[5] | rx_nes_loopback_ena_nt | rw | 0x0 | 1 - 近端串行环回(near-end serial) |
| 0x44[4] | rx_fes_loopback_ena_nt | rw | 0x0 | 1 - 远端串行环回(far-end serial) |
| 0x44[3] | rx_bitck_loopback_ena_nt | rw | 0x0 | 1 - rx_bitck 环回本 lane 的 TX |
| 0x44[2] | tx_nes_loopback_ena_nt | rw | 0x0 | 近端串行环回(TX 侧),片上测试覆盖最大 |
| 0x44[1] | tx_fes_loopback_ena_nt | rw | 0x0 | 远端串行环回(TX 侧),用于低速测试 |
| 0x44[0] | tx_bitck_loopback_ena_nt | rw | 0x0 | 1 - rx_bitck 环回本 lane 的 TX |
近端串行环回(本端 TX → 本端 RX)不需要对端设备就能自测整条模拟链路,是排查”链路起不来”的第一动作;远端环回则需要对端配合。
实战:一条从现象到寄存器的排查路径
把三章串起来,假设”以太网链路训练失败”,典型的查表顺序是:
- 确认本端配置发出去了:读
eth_an_adv_ability_reg1~3,确认能力码字已按eth_an_tr_disable上升沿时序写入。 - 看协商过程:置
anlt_mon(RX 分区 0x4)使能并选源为 Clause 72/92 RX 帧,抓到的帧配合eth_an_lp_adv_ability_reg1~3确认对端到底通告了什么;eth_an_ctrl_reg1的 restart 位可重跑协商。 - 检查信号质量:TX 侧确认
fir(0x50)预加重未被错误 override(tx_fir_ovrd相关注册位与ovr_en_a),必要时用ctl_dbe_pllcharz把 TX 时钟/模拟信号引出观测。 - 检查速率/位宽落点:读
eth_anlt_rate_reg1~3、eth_anlt_width_reg1~4,再对 TX 侧rate_cntrl_tx.postdiv_nt与 RX 侧对应速率寄存器,确认两端速率一致。 - 环回收缩问题域:置
loopback_cntrl.ena_nt=1并打开近端串行环回,若环回仍失败,问题在本端/板级;若环回通过,重点转向对端与互连。 - 全程用 stat 对账:每一步都用
dig_soc_lane_stat_reg1~3和各_rdreg回读硬件真实状态,避免”软件写了好、硬件没生效”。
通关标准:
- 能说出 TX 章三大件:
afe_octerm_tx(端接 override)、fir(FIR 抽头,含”别直接用”警告)、rate_cntrl_tx(后分频)。- 能描述自协商最小流程:写 ability 码字 →(可选 restart)→ 读 lp_ability 对端镜像 → 查 anlt rate/width 落点。
- 会用
loopback_cntrl打开近端串行环回,并知道近端/远端环回各自隔离了哪一段问题域。
自测:为什么手册警告不要直接用
fir(0x50)寄存器设置 C(1)/C(-1) 系数?因为该寄存器的 22bit 抽头布局(C(1)[21:17]、C(0)[16:11]、C(-1)[10:6]、C(-2)[5:3]、C(-3)[2:0])不是 SOC 语义下的系数表示。正常配置应通过 SOC/MSS 接口的 ictl_tx_fir 信号(或 IP 参数)下发;直接写寄存器会与接口配置冲突或被 override 语义覆盖,只适合底层调试。
自测:近端串行环回和远端串行环回分别怎么帮你定位问题?
近端串行环回把本端 TX 直接连回本端 RX,不依赖对端,一次测完本端驱动器+链路+接收器整条路径——环回失败说明问题在本端或板上走线;远端串行环回要经过对端设备(或对端配合回环),用于隔离互连和对端问题。调试策略是先近端后远端,逐步收缩问题域。
自测:
eth_an_lp_adv_ability_reg1和eth_an_adv_ability_reg1一字之差,差别是什么?
adv_ability是本端要发出去的能力通告码字(需要软件写入);lp_adv_ability的 lp 是 Link Partner(链路伙伴),是对端发来的能力码字的镜像寄存器(只读观察)。协商失败时对比两者最直接。
自测:
dig_soc_lane_ovrd_*和dig_soc_lane_stat_*为什么总是成对出现?调试时怎么配合用?ovrd 系列”接管”:把原本由 SOC/MSS 引脚驱动的 lane 控制信号改为寄存器驱动,用于在不改软件逻辑的情况下强制某个状态;stat 系列”观测”:把接口上信号的实际值(octl_*)回读出来。配合用法是先用 ovrd 强制目标状态、再用 stat 确认硬件真的进入了该状态,把”软件认为”与”硬件实际”对账。
自测:
rst_afe_tx的复位位语义和很多教材相反,具体是什么?漏看会怎样?它是 1 = 正常运行、0 = 复位(例如 driver_ba、p2s_ba 等),而不是常见的”1 = 复位脉冲”。漏看会导致把本想复位的块写成了”保持正常”,或把正常运行的块意外拉进复位——后者会让链路直接掉死且不易察觉。