PHY 基础知识
各位好,我是老刘,在高速接口这块摸爬滚打了十几年。今天咱们正式开始聊 PHY 寄存器,尤其是跟眼图优化相关的那些。不过想调好眼图,你得先搞清楚 PHY 到底是干什么的、它长什么样、寄存器又是怎么组织的。
PHY 在高速串行链路中的角色
说白了,PHY 就是物理层收发器。它位于数字逻辑和物理传输介质之间,负责把要发的数据变成适合在差分线上跑的电信号,再把接收到的微弱信号恢复成干净的数字比特流。
我经常跟新同事打比方:PHY 就像串行链路的“翻译官”。MAC 层说并行数据,PHY 转成串行;线上信号有损耗、有噪声,PHY 还得做均衡和时钟恢复。没有它,你芯片里的 0/1 根本出不去,也读不进来。
一个典型的串行链路长这样:
- 发送端(TX):并行数据 → 串化 → 预加重/去加重 → 驱动差分对
- 通道(Channel):PCB 走线、连接器、电缆,会衰减高频分量
- 接收端(RX):CTLE/DFE 均衡 → CDR 时钟恢复 → 解串 → 数据送到上层
我记得有一次调试 PCIe 3.0 链路,发送端眼图打开得挺好,可接收端就是锁不住。排查了半天,原来是 PCB 过孔电感太大,高频分量丢光了。从那以后我对“通道”这两个字特别敏感。
典型 PHY 架构:PCS / PMA
PHY 内部通常分两层:PCS(Physical Coding Sublayer)和 PMA(Physical Medium Attachment)。IEEE 802.3 和 PCIe 规范都沿用这套划分。
| 层级 | 主要工作 | 我眼中的关键 |
|---|---|---|
| PCS | 编码解码(8b/10b、64b/66b)、加扰/解扰、对齐、协商 | 负责“数据包得传输” |
| PMA | 串化/解串、时钟产生、驱动器/接收器、均衡、CDR | 负责“电信号得干净” |
PCS 更贴近数字域,PMA 则是模拟混合信号的重灾区。很多眼图参数——比如 TX 摆幅、预加重强度、RX 的 CTLE 增益、DFE 抽头系数——都在 PMA 的寄存器里。
你想想看,调眼图实际就是在跟 PMA 的模拟模块对话。数字工程师常忽略这个,觉得改个寄存器值就行。我见过有人把 CTLE 调到最大,结果噪声也跟着放大,眼图反而更差。所以咱们得先清楚这些寄存器属于哪个模块、怎么配合。
下面这张图画出了 PHY 在链路中的位置及内部 PCS/PMA 的分层:
寄存器空间划分
每个 PHY 芯片内部都有一片寄存器“地图”。拿常见的 MDIO(Management Data Input/Output)接口来举例,寄存器地址从 0x00 到 0x1F 共 32 个。但实际芯片会通过 MMD(MDIO Manageable Device)扩展更多空间。
| 地址范围 | 功能分类 | 我关注的关键寄存器 |
|---|---|---|
| 0x00 – 0x0F | 标准控制/状态 | 复位、速度选择、Link状态 |
| 0x10 – 0x1F | 厂商自定义 | TX摆幅、预加重强度、RX均衡配置 |
| MMD 扩展 | PMD/PMA/PCS 详细参数 | 眼图监视、DFE抽头系数、CDR锁定状态 |
嗯,这里要注意:眼图优化相关的参数几乎全在厂商自定义和 MMD 扩展区。标准寄存器只管让你看个链路通不通,真要调质量,你得进“深水区”。
我曾经踩过一个坑:某款 10G PHY 的 DFE 系数是通过 MMD 地址 0x8400 写的,但手册写成了 0x4800。我折腾了一周,最后用示波器对比波形才发现索引错了。所以 拿到 PHY 手册后第一件事是画寄存器地图,每个要调的参数都标上地址和类型。
寄存器访问的基本模式
// MDIO 写示例(伪代码)
uint16_t mdio_write(uint8_t phy_addr, uint8_t reg_addr, uint16_t data)
{
// 1. 设置 PHY 地址 (phy_addr)
// 2. 设置寄存器地址 (reg_addr)
// 3. 写入 16 位数据
// 4. 等待 MDC 时钟完成操作
// 5. 检查状态位
}
代码不难,关键是你得知道写哪个寄存器。举个实际例子:调整 TX 预加重,很多 PHY 用的是 0x1C 或 0x1D,低四位控制预加重幅度,高四位控制去加重。不同厂商可能完全不同。