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 系统框架图(PCS / PMA / 物理介质) PCS(物理编码子层) 8B/10B 编码 直流平衡 + 翻转密度 时钟补偿 SKP 插入/删除 对齐标记 多通道对齐 状态管理 Training/Ready 并行数据 + 控制信号 PMA(物理介质适配层) Serializer 并转串(TX) PLL / CDR 时钟生成+恢复 Deserializer 串转并(RX) TX Driver / RX FE 均衡 + 驱动 差分串行数据 物理介质(差分线 / 背板 / 连接器 / 线缆) 关键交互 PCS 处理数据格式和协议,PMA 处理物理信号。两者通过并行接口、时钟和控制信号(pll_lock, cdr_lock, signal_det)握手配合。

关键设计考量

搞 SerDes 设计,有几个点我每次都会反复检查:

  1. 时钟架构:PLL 的参考时钟源稳不稳?整数分频还是小数分频?小数分频的杂散怎么抑制?
  2. 电源完整性:PMA 模拟电路对电源噪声极其敏感。我习惯给 PMA 单独做 PDN(电源分配网络)仿真
  3. 编码选择:8B/10B 编码开销 25%,64B/66B 只有 3%,但 DC 平衡和游程控制就差一些。
  4. 通道损耗:10Gbps 以上信号过背板,损耗动辄十几 dB。TX 预加重和 RX 均衡的配合需要精细调
  5. 字节同步策略:收端怎么找到第一个字节边界?commma 码字检测是不是够快?多通道时对齐标记的搜索顺序是什么?
我的调试习惯:先在仿真环境里把 PCS 和 PMA 的交互行为跑通——用 verilog 的 PLI 把 C 模型和 RTL 绑在一起协同仿真。等仿真通过再上 FPGA 或者流片,不然真的烧钱还费时间。

嗯,PMA 和 PCS 的基本框架就这些。后面每一章我们都会深入展开——PCS 的编解码算法怎么做、PMA 的 CDR 环路怎么设计、眼图测试怎么看……到时候再详细聊。