简介:这份 SerDes 培训教材源自 Springer 出版、由 IBM 多位资深工程师合著的高速串行器件专著。它面向芯片设计、硬件接口协议与高速互连领域的工程师及研究生,解决从并行 I/O 转向高速串行链路时的知识断层。内容围绕并串与串并转换、8B/10B 与 64B/66B 编解码、时钟数据恢复与锁相环、前向纠错等机制展开,并延伸到差分信号、阻抗匹配、反射串扰与损耗等信号完整性问题,也涉及功耗管理与多标准兼容性等工程约束,涵盖以太网、光纤通道、SAS/SATA、HDMI 及数据中心互连等场景。压缩包内为 1 个 PDF 文件,约 10.89MB,单册完整收录,便于离线阅读与按章查阅,已有 918 人学习。读者可建立从器件原理到系统设计的完整认知,理解高速链路中均衡、抖动与误码的关联,并借鉴书中的案例分析思路,为接口选型、链路调试与设计评审提供参考。
1. 从并口到10Gbps串行:一张SerDes设计知识地图
SerDes设计这块,国内能系统讲透的资料不多,多数人是抱着芯片数据表一点点拼出全貌的;这份来自某芯片厂商内部培训体系的教材,走的是另一条路——先给地图,再逐层往下填。它把硬件接口协议里这条高速串行链路拆成四段:器件特性与功能(并行总线、源同步接口、串并转换、均衡、CDR、PLL)、协议逻辑与标准(编码扰码、位对齐、去偏斜、各类电气层规范)、四个专题(参考时钟、测试诊断、信号完整性、功耗),最后落到芯片集成(仿真模型、测试综合、静态时序、布局封装)。适合已经能看懂数字时序、正准备把HSS核放进自己芯片里的人;也适合复习阶段想查漏的人,因为它的章节顺序本身就是一条从"是什么"到"怎么用"的推演链。
2. HSS核解剖:发送、接收、PLL三个切片的职责边界
一章讲完HSS的"是什么",落到具体器件上就是三个切片:发送机、接收机、PLL。这三个切片各自的寄存器、时钟域、诊断通路是分开的,但复位和配置序列又必须串起来看,所以复习时最好把它们当成一台机器的三个工位,而不是三份独立的功能列表。
2.1 发送机切片:并行数据怎么变成差分串行流
发送侧的入口是并行数据接口,宽度可配,内部逻辑时钟和串行输出时钟之间是倍率关系。教材里反复强调的一个设计点是速率模式:全速率、半速率、四分之一速率、八分之一速率。这不是省电开关那么简单,它直接决定内部并行总线要多宽、时钟树要跑多快、时序收敛的难点落在哪一级。半速率模式下串行器用上下沿各取一次数据,内部时钟频率减半,功耗和时序压力都跟着降,代价是占空比失真变得敏感——这条在时钟章节会再翻出来算账。
真正决定信号能不能过信道的是FFE(前馈均衡)。信道对高频的衰减远大于低频,方波传过去边沿被抹平、眼图闭合,所以发送端要人为把低频压低、高频抬起来,这就是预加重与去加重。FFE抽头系数可编程,抽头数目和步进决定了能补偿多长的信道。调抽头的血泪经验是:抽头不是越大越好,过补偿会把近端眼图抬得很好看、远端反而更差,必须结合信道损耗曲线一起看。
发送切片上还有几组容易被当成附加项、实际却天天用到的功能:PRBS图案发生器和环回路径用于诊断;带外信令(OBS)用低摆幅、低带宽的方式在链路空闲时传管理信息;JTAG 1149.1与bypass模式决定这颗核在边界扫描链里是参与者还是透明通道;面向PCIe的一组特性则把电气空闲、电源状态这些协议要求直接做进了硬件。
| 速率模式 | 内部并行时钟 | 串行器采样方式 | 主要代价 |
|---|---|---|---|
| 全速率 | 最高 | 单沿 | 时序余量最紧、功耗最高 |
| 半速率 | 减半 | 双沿 | 占空比失真敏感 |
| 四分之一速率 | 再减半 | 多相时钟 | 相位误差累积 |
| 八分之一速率 | 最低 | 多相时钟 | 低功耗场景专用,抖动预算更紧 |
提示:速率模式一改,PLL分频比、并行接口宽度、时序约束三处必须同步改,只改一处是最常见的翻车起点。
2.2 接收机切片:均衡、CDR与模式选择
接收侧要解决的是"眼图已经闭合了怎么把数据抠出来"。教材把接收均衡分成两条路线:DFE(判决反馈均衡)和非DFE(线性均衡)。DFE用已判决的历史比特去抵消当前符号的ISI,好处是不放大噪声,坏处是错误会传播——一个比特判错,后续几个比特跟着受影响。线性均衡结构简单、无错误传播,但会把噪声和信号一起抬起来。选哪条路线,取决于信道损耗主要是ISI还是噪声主导,这个判断在复习时最好和信号完整性章节的概率密度函数对着看,两边是一套语言。
CDR(时钟数据恢复)是接收侧的心脏。它从数据跳变里提取相位信息,用相位旋转器做相位插值,把采样点锁在眼图正中间。这里的关键参数是环路带宽:带宽窄,抗抖动能力强但跟踪速度快不了,遇到扩频时钟(SSC)就会跟丢;带宽宽,跟踪快但会把高频抖动放进来。支持SSC的链路必须专门核算这一点。
终端与耦合方式(AC耦合还是DC耦合)决定了共模电平怎么建立,信号检测电路负责在链路没起来时给出一个确定的状态而不是让后级去猜。眼图质量监测把内部采样点的统计结果暴露出来,是调试阶段最值钱的黑匣子。JTAG 1149.6则专门管AC耦合链路的边界扫描,和1149.1不是一回事,这一点很容易混。
2.3 PLL切片与复位、重配置序列
PLL切片负责把参考时钟倍频到串行速率,内部包含参考时钟输入、分频器、VCO粗校准、锁检测、上电复位和复位序列器。VCO粗校准常被忽略:它在一个较宽的频段里先把VCO推到目标频点附近,再让环路细调,没有这一步,锁定时间会变长甚至锁不上。
重配置序列是三个切片里最容易踩坑的地方。改发送速率、改接收均衡模式、切换PCIe电源状态,都不是写一个寄存器就完事,而要按"关数据通路—改配置—触发复位序列—等锁定—重新使能"的顺序走。下面这段伪代码把顺序固化下来,逻辑比具体寄存器名更重要:
# 改发送速率的安全顺序(寄存器名为示意,需按实际器件映射) def retune_tx(dev, new_rate_code): dev.write(REG_TX_ENABLE, 0) # 1. 先关数据通路,避免半配置状态下打出非法码流 dev.write(REG_TX_RATE, new_rate_code) # 2. 改速率编码,同时影响PLL分频比 dev.write(REG_PLL_RESET, 1) # 3. 触发PLL复位序列器 dev.write(REG_PLL_RESET, 0) if not wait_lock(dev, timeout_ms=10): # 4. 等lock位,超时说明VCO校准或参考时钟有问题 raise RuntimeError("PLL lock timeout") dev.write(REG_TX_ENABLE, 1) # 5. 锁定后再放数据new_rate_code是器件定义的速率编码,不是直接的Gbps数值;timeout_ms按参考时钟频率和环路带宽估,一般给到锁定时间的数倍。第4步的等待不能省,lock位没起来就使能发送,输出的是无意义码流,对端会直接报链路失步。接收侧的重配置同理,只是要多等一步CDR重新锁定。
3. 协议逻辑与标准族谱:硬件接口协议里谁在干什么
HSS核只负责把比特搬过去,比特怎么组织、怎么找到边界、多根链路之间怎么对齐,是协议逻辑的活。这部分在教材里占了很大篇幅,也是复习时最容易只记名词不记因果的地方。
3.1 编码、扰码与错误检测:协议逻辑的四件套
串行链路上跑的数据必须解决三个问题:直流平衡(否则AC耦合电容两端电平漂移)、足够的跳变密度(否则CDR没东西可跟)、以及接收端能识别边界。8B/10B用10位表示8位,开销25%,靠控制字符和comma序列做对齐,K码还能承载链路管理语义。64B/66B只加2位同步头,开销约3%,配合扰码打散长连0和长连1,边界靠同步头加锁定状态机识别。两者的差别不只是开销:
| 编码方式 | 开销 | 对齐手段 | 典型代价 |
|---|---|---|---|
| 8B/10B | 25% | comma序列,逐符号可判 | 带宽浪费大,逻辑简单 |
| 64B/66B | 约3% | 同步头加块锁定状态机 | 需要扰码,失锁恢复更慢 |
扰码不是编码,它不增加比特,只是用多项式把数据随机化,长连0长连1被打散,频谱也被摊平。错误检测与纠正在这条链路上分层出现:链路层用CRC查错,物理层可以加FEC前向纠错直接纠正一定数量的比特错误。FEC的代价是延迟和额外带宽,它和链路的误码率目标是一笔要算清楚的账,不能默认打开就完事。
有效带宽的估算值得单独练一遍,考试和面试都爱问:
def payload_rate(lane_gbps, coding, lanes=1): # 编码开销:8b10b 每10位传8位;64b66b 每66位传64位 overhead = {"8b10b": 0.20, "64b66b": 2/66, "raw": 0.0}[coding] return lane_gbps * lanes * (1 - overhead) print(payload_rate(10, "8b10b", 4)) # 4条10G链路,8B/10B编码后的净荷速率参数lane_gbps是单条链路的线路速率,lanes是并行链路数,coding决定开销比例。算出来的净荷速率是协议层能用的上限,还没扣掉帧头、空闲码和FEC,实际可用值要再降一档。
3.2 位对齐、去偏斜与多链路绑定
单条链路的位对齐靠comma或同步头找到符号边界,再按通道对齐字符把接收数据落到统一的逻辑帧上。多链路场景难得多:几条物理链路长度不同,到达时间差就是skew,接收端必须在去偏斜缓冲里把各条链路拉齐,再按条带或交织规则还原成原始字节流。
这里有两个顺序不能反。第一,先完成每条链路各自的位对齐,再做跨链路去偏斜,顺序反了缓冲里装的是没对齐的数据,越拉越乱。第二,去偏斜缓冲的深度要覆盖最坏skew加时钟容差,深度不够会周期性丢数据,深度太大又增加延迟。字节序和位序的约定同样容易出错,尤其是跨厂商对接时,大小端和lane编号方向不一致,现象是数据看着像但整体错位。
3.3 标准族谱:五类接口标准各自解决什么问题
教材用一整章横向铺开各类标准,复习时按"解决什么问题"来记比按协议名记更牢:
| 标准族 | 关键子层与概念 | 典型场景 |
|---|---|---|
| SONET/SDH | STS-1与STS-N帧、层级时钟、系统参考模型 | 长距离同步传输,时钟精度要求最严 |
| 行业实施协议 | SFI-5.2、SPI-S、CEI-P、电气层协议 | 芯片与光模块、芯片与芯片之间的通用电气约定 |
| 以太网 | PHY参考模型、MAC、XGXS、XFI、背板以太网、PMD子层 | 局域网与背板互连,速率代际最多 |
| 光纤通道 | SAN、协议层、帧与信令、物理接口、10G接口 | 存储区域网,强调有序与流控 |
| PCI Express | 架构、物理层逻辑、电气物理层、电源状态 | 板内互连,电源状态管理最细 |
同一颗HSS核可以服务多种标准,差别在协议逻辑和电气参数配置,这也是为什么教材把"器件"和"标准"分成两部分讲。SONET/SDH那套层级时钟的概念最抽象,但它是理解抖动传递的入口;PCIe的电源状态则把前面讲的复位序列串了起来。
4. 抖动与信号完整性:眼图背后的概率账本
信号完整性这章在教材里分量很重,因为它把前面所有模拟因素收拢到一个可量化的指标上。很多人学到这里会卡住,原因是把它当成了"看眼图"的经验活,其实它是一套概率语言。
4.1 抖动分解:总抖动为什么是DJ加若干倍RJ
抖动按来源分成两类。确定性抖动DJ有界、可重复,包括占空比失真、数据相关抖动(ISI)、周期性抖动(电源噪声耦合进来的那种)。随机抖动RJ服从高斯分布,理论上无界,所以只能用均方根值描述,再按目标误码率折算成峰峰值。
总抖动TJ的计算是整个链路预算的核心:TJ = DJ(峰峰) + 2Q×RJ(均方根),其中Q由目标误码率决定,1e-12对应Q约7.03,也就是常说的14倍西格玛。
from math import sqrt from scipy.special import erfinv def total_jitter_ui(rj_sigma_ui, dj_pp_ui, ber=1e-12): # 双侧误码率对应的Q值,1e-12时约为7.03 q = sqrt(2) * erfinv(1 - 2 * ber) return dj_pp_ui + 2 * q * rj_sigma_ui # 2Q ≈ 14.06 print(total_jitter_ui(0.01, 0.15)) # RJ=0.01UI, DJ=0.15UI 时的总抖动参数都用UI为单位,rj_sigma_ui是随机抖动的均方根,dj_pp_ui是确定性抖动的峰峰值。算出来的TJ必须小于1UI,剩下的才是眼图张开度。这里最容易忽略的是RJ的换算倍数:目标误码率从1e-12放宽到1e-15,倍数从14涨到约16,看着只差2,在余量紧张时就是过与不过的区别。
抖动预算和抖动容限是同一枚硬币的两面。预算从发送端出发,把时钟抖动、信道引入的ISI、接收端自身噪声逐项列出来求和;容限则是标准规定的接收端必须容忍多少抖动。两者对接时如果只对总抖动,很容易出现"各项都合格、合起来超了"的情况,因为DJ的各个分量不是简单线性叠加。
4.2 概率密度函数:高斯与双狄拉克
教材专门讲概率密度函数不是数学炫技。随机抖动是高斯分布,确定性抖动在理想情况下可以近似成两个冲激,也就是双狄拉克分布。把两者卷积,得到的就是总抖动的概率密度,眼图上那条浴盆曲线的底部宽度就是这么来的。
理解这一点之后,看眼图就不会只盯着"张不张开",而会去看直方图的形状:高斯尾巴有多长、双狄拉克的两个峰离得多远。眼图质量监测功能输出的统计结果,本质就是这些分布的采样估计。
4.3 信道、封装模型与Spice仿真矩阵
信道部分要关注三件事:损耗随频率的变化、反射(阻抗不连续)、串扰(相邻链路耦合)。封装模型不能省,因为从芯片焊盘到封装引脚这一小段在10Gbps下已经是传输线,模型精度直接决定仿真结果可不可信。
Spice模型有传统模型和混合行为级模型两条路。传统模型精度高但仿真慢,跑一个长码型可能要几小时;混合模型把线性无源部分和行为级部分分开,速度快得多,适合在PVT角上做扫描。仿真矩阵就是把工艺角、电压、温度、码型长度、信道长度组合起来的一张表,缺项就意味着某个角落没验证过。
教材还提到统计方法:不做逐比特的瞬态仿真,而是把信道的脉冲响应和抖动分布做卷积,直接算出误码率轮廓。这套方法配合CDR模型使用,是长信道评估的常规手段。它的前提假设是线性时不变,遇到强非线性(比如驱动器限幅)就要回到瞬态仿真核对。
5. 易漏点与易错点:五个最容易在项目里翻车的地方
复习阶段最怕的不是不会,而是以为会了。下面这五条都是从"看起来是常识、实际经常错"的位置挑出来的,每条按"易漏点—为什么漏—怎么补"走一遍。
第一,把HSS核当成复杂数字IO单元。为什么漏:数字设计出身的人习惯用建立保持时间看一切,HSS的接口在寄存器层面确实像普通同步接口,于是很自然地把它归到数字范畴。怎么补:但凡速率上了几个Gbps,模拟因素就必须进预算——终端匹配、共模电平、AC耦合电容、封装寄生。补的办法是把信号完整性章节的抖动预算当成必做项,而不是出问题才回头看。
第二,重配置不按复位序列走。为什么漏:单次配置时顺序对错看不出差别,只有在运行中动态改速率、切均衡模式、进PCIe低功耗状态时才暴露,而这类场景在实验室里往往被测序简化掉了。怎么补:把第2章那段伪代码固化成驱动层的一个函数,任何配置变更都走同一条路径,并且强制检查lock位和信号检测状态,超时就报错而不是重试到天荒地老。
第三,参考时钟质量被默认合格。为什么漏:参考时钟通常由外部时钟芯片提供,数据表上写着相位抖动指标,看起来达标就过了。怎么补:参考时钟要单独核算三件事——抖动(尤其经过PLL之后的抖动传递)、占空比失真、压摆率与信号电平。单端时钟和差分时钟的接法不同,测试要求也不同,差分时钟还要做共模和幅度分析。时钟树布线一旦定下来就很难改,这是典型的后悔药场景。
第四,多链路场景漏做去偏斜,或者顺序反了。为什么漏:单链路调试通了,扩到四链路时如果每条链路各自能收到正确码型,就以为成了,其实跨链路的字节流还是错位的。怎么补:明确"先位对齐、后去偏斜"的顺序,在去偏斜缓冲前后各加一个可观测的计数器,测量实际skew与缓冲深度的关系,把缓冲深度按最坏skew加时钟容差留足余量。
第五,功耗只算数字动态功耗。为什么漏:数字功耗有成熟公式,HSS的功耗却分成多个电源域,还随速率模式、均衡开关、环回使能变化,容易被当成一个固定常数。怎么补:按"数字逻辑AC/DC + 非数字电路 + HSS功耗方程"三层分别估,再把模式相关的部分列成一张表,把每种工作模式下的电流加总。芯片级供电设计如果只按典型模式算,峰值模式就会掉压。
6. 复习清单:按模块自检,把知识点串成一条链路
到这一章不适合再往下堆新内容,把前面的东西收成一张自检表更实用。方法是按"信号从发送端走到接收端"的顺序排,每一站问自己三个问题:这一站的功能是什么、关键参数有哪些、失败时先看哪个观测点。
| 环节 | 必须能答出的问题 | 自检方式 |
|---|---|---|
| 参考时钟 | 单端还是差分,抖动与占空比指标是多少 | 能否说出抖动如何传到输出 |
| PLL | 分频比、VCO校准、锁定判据 | 能否画出上电到锁定的时序 |
| 发送机 | FFE抽头、速率模式、输出摆幅 | 能否解释过补偿的后果 |
| 信道与封装 | 损耗、反射、串扰的主要来源 | 能否列出仿真矩阵的维度 |
| 接收机 | 均衡模式、CDR环路带宽、终端方式 | 能否说清DFE的错误传播 |
| 协议逻辑 | 编码方式、对齐手段、去偏斜顺序 | 能否手算净荷速率 |
| 测试诊断 | PRBS图案、环回路径、边界扫描类型 | 能否区分1149.1与1149.6 |
| 集成 | 复位序列、时序约束、封装选型 | 能否写出重配置顺序 |
复习时我习惯再加一道量化的自检,把链路余量算一遍,比背概念更能暴露理解漏洞:
def link_margin(tx_swing_mv, channel_loss_db, rx_sensitivity_mv, jitter_margin_ui): # 简化模型:只核对电压余量与抖动余量两项是否同时为正 rx_level = tx_swing_mv * (10 ** (-channel_loss_db / 20)) voltage_margin = rx_level - rx_sensitivity_mv return {"rx_mv": round(rx_level, 1), "voltage_margin_mv": round(voltage_margin, 1), "jitter_margin_ui": jitter_margin_ui, "pass": voltage_margin > 0 and jitter_margin_ui > 0} print(link_margin(800, 20, 100, 0.12))channel_loss_db是目标奈奎斯特频率处的信道损耗,rx_sensitivity_mv是接收端能识别的最小摆幅,jitter_margin_ui是1UI减去总抖动后的剩余。两项余量必须同时为正,只满足一项的链路在温变或批次波动下就会失效。
从那以后我每次打开一份新的HSS手册,都强制走一遍这个顺序:先确认参考时钟和PLL能不能锁,再确认发送端抽头设了多少、速率模式是哪一档,然后才去看协议层配置。跳过前面直接调协议参数,翻车的概率高得离谱,因为底下那层根本没稳住。希望帮到你。
本文还有配套的精品资源,点击获取