1. SerDes 概述与 PMA/PCS 基本概念
做芯片设计这些年,SerDes 一直是个绕不开的话题。你想想看,为什么我们放着好好的并行总线不用,非要折腾串行传输?说白了,就是物理瓶颈摆在那儿——频率一高,并行信号之间的时延偏差(skew)能把人搞疯。
为什么需要 SerDes?
我最早接触 SerDes 是因为一个存储项目。当时并行 DDR 接口已经跑到 800Mbps,layout 工程师每天都在跟走线等长较劲,就差拿着尺子一根根量了。后来切到串行方案,走线长度差个几厘米根本不影响,项目周期直接缩短了三四成。
SerDes 的核心任务其实就两个:发端并转串,收端串转并。但真正把它变成一个可用的系统,你需要考虑的东西远不止这些。
串行传输的三大优势:
- 减少芯片引脚数——8 位并行至少 8+1=9 根线,SerDes 一对差分线搞定
- 极大降低 EMI——差分信号的共模抑制特性天然抗干扰
- 从根本上消除 skew 问题——串行数据只有一根通道,不存在多 bit 对齐烦恼
SerDes 基本架构
一个标准的 SerDes 系统,从顶层看分为三层:
| 层次 | 位置 | 主要功能 |
|---|---|---|
| PCS(物理编码子层) | 靠近数字逻辑 | 数据编解码、时钟补偿、链路控制、对齐标记插入/检测 |
| PMA(物理介质适配层) | 中间桥梁 | 并串转换、串并转换、时钟恢复(CDR)、均衡初始化 |
| 物理介质(通道) | 芯片外部 | 差分线、背板、连接器、电缆 |
这不是我发明的分类——IEEE 802.3 标准里早就定好了。只不过实际项目中,不同厂商对 PCS/PMA 的边界划分可能略有调整,但大的框架不会变。
PMA——物理介质适配层
先讲 PMA,因为它离物理世界最近。我记得第一次调 PMA 的 CDR 模块时,锁相环怎么都锁不住,蹲在实验室看了三天眼图才找到问题——参考时钟噪声太大。
PMA 的关键组件有这些:
- Serializer(并串转换器):把 PCS 送过来的并行数据拍成高速串行流。通常用移位寄存器实现,也有人用 MUX 树
- Deserializer(串并转换器):接收端把串行数据恢复成并行字。这里有个坑——必须正确找到字节边界
- CDR(时钟数据恢复):从串行数据里提取时钟。没有单独的时钟线,所有时序信息都藏在数据翻转边沿里
- PLL(锁相环):提供高速时钟。我个人习惯把 PLL 分成两类——发送端 PLL 负责产生串行时钟,接收端 PLL 给 CDR 提供参考
- TX Driver / RX Front-End:驱动电路和接收前端,包括预加重、均衡器(CTLE、DFE)
我曾经踩过的坑:PMA 的模拟部分和数字部分共用一个电源域,结果数字开关噪声串进来,CDR 抖动瞬间超标。后来强制加了独立的 LDO 和 deep n-well 隔离才解决。嗯,PMU 设计的时候一定记得给 PMA 留干净的供电。
PCS——物理编码子层
PCS 干的活比 PMA 更「数字」些。说白了,它要保证从 PMA 收上来的乱码能还原成有意义的用户数据。
- 8B/10B 编码:每 8bit 数据映射成 10bit 码字,保证直流平衡和足够的翻转密度。我手上有过一个案子,客户为了省带宽非要改用 64B/66B,结果短距离没问题,长距离链路老是丢同步
- 时钟补偿:发送端和接收端存在微小频率偏差。PCS 通过插入/删除空闲字符(SKP)来吸收这个差异。你想想看,如果两个晶振各偏 100ppm,一秒就差了 0.02%,数据量一上来肯定会丢
- 对齐标记(Alignment Marker):多通道链路里,每个通道独立传播,延迟不同。PCS 插入特殊码字,接收端根据这些标记把多路数据对齐
- 链路状态管理:从初始训练到正常工作,中间有 Training、Init、Ready 几个状态,每一步都得握手确认
小技巧:调试 PCS 的时候,先把 8B/10B 解码逻辑单独拿出来仿真,喂已知码型看输出对不对。如果编码器/解码器都通不过,后面链路层的事想都别想。
PMA 与 PCS 的交互
这两个模块的接口信号,每个 SerDes 大同小异。我习惯这么理解:
- 数据通路:PCS 送并行数据给 PMA,PMA 串行发出去;接收端 PMA 把串行数据恢复成并行再丢给 PCS
- 状态信号:PMA 告诉 PCS「我 CDR 锁上了」、「我信号丢失了」;PCS 告诉 PMA「我要开始训练」、「换个速率」
- 时钟域:PCS 工作在相对较低的并行时钟域(比如 156.25MHz),PMA 工作在高速串行时钟域(比如 6.25GHz),两个域之间靠 FIFO 过渡
// 一个简化的 PCS-PMA 接口信号定义
module pcs_pma_if (
// 发送方向
output reg [15:0] tx_data // PCS -> PMA 并行数据
output reg tx_clk // 并行时钟
input tx_rdy // PMA 准备好接收
// 接收方向
input [15:0] rx_data // PMA -> PCS 并行数据
input rx_clk // 恢复出的并行时钟
output reg rx_rdy // PCS 准备好接收
// 状态
input pll_lock // PMA PLL 锁定
input cdr_lock // 接收 CDR 锁定
input signal_det // 信号检测
);
知识结构总览
下面这张图总结了 SerDes 系统的整体框架。你可以在看后续章节时不断回头对照它——说实话,我自己做设计时也会在墙上贴一张类似的图。
关键设计考量
搞 SerDes 设计,有几个点我每次都会反复检查:
- 时钟架构:PLL 的参考时钟源稳不稳?整数分频还是小数分频?小数分频的杂散怎么抑制?
- 电源完整性:PMA 模拟电路对电源噪声极其敏感。我习惯给 PMA 单独做 PDN(电源分配网络)仿真
- 编码选择:8B/10B 编码开销 25%,64B/66B 只有 3%,但 DC 平衡和游程控制就差一些。
- 通道损耗:10Gbps 以上信号过背板,损耗动辄十几 dB。TX 预加重和 RX 均衡的配合需要精细调
- 字节同步策略:收端怎么找到第一个字节边界?commma 码字检测是不是够快?多通道时对齐标记的搜索顺序是什么?
我的调试习惯:先在仿真环境里把 PCS 和 PMA 的交互行为跑通——用 verilog 的 PLI 把 C 模型和 RTL 绑在一起协同仿真。等仿真通过再上 FPGA 或者流片,不然真的烧钱还费时间。
嗯,PMA 和 PCS 的基本框架就这些。后面每一章我们都会深入展开——PCS 的编解码算法怎么做、PMA 的 CDR 环路怎么设计、眼图测试怎么看……到时候再详细聊。