ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

56G PAM4 SerDes数字FFE设计:16抽头自适应均衡的工程实践

56G PAM4 SerDes数字FFE设计:16抽头自适应均衡的工程实践 做高速 SerDes 的都知道PAM4 链路真正考验人的不是架构图上的模块堆叠而是你在 28GBaud 这种符号率下怎么把一个 16 阶数字 FIR 塞进可综合时钟域同时让它的自适应环路稳定收敛、能通过眼图测试、能抗住温度和电压漂移。这个项目是我 56G PAM4 SerDes 接收侧设计工作的核心模块之一最终落地的是一个 16-tap 数字 FFE前馈均衡器。这里不列那种“设计指南”式的清单我把整个设计过程中算过哪些账、踩过哪些坑、最后怎么验证的完整拆开来聊。56G PAM4 的符号速率是 28GBaud意味着单位间隔只有约 35.7ps奈奎斯特频率到了 14GHz。电缆、背板、连接器在这个频段的插损通常已经非常可观更麻烦的是 PAM4 的四个电平之间电压差只有 NRZ 的三分之一信噪比天然就丢了约 9.6dB。所以单靠模拟 CTLE 或者单靠 DFE 都不现实数字 FFE 在这样的链路里不是一个“加分项”而是必需项。我会把整个设计按实际推进顺序来讲先聊为什么是 16 抽头、均衡任务怎么拆再讲顶层架构特别是多相并行 FIR 的相位折叠问题然后说自适应环路包括和 CDR、AGC 的握手顺序接着是验证环境里眼图、TDEC 这些指标怎么闭环最后是流片落地之后遇到的几个真实问题。如果你正准备做类似的高速 SerDes DSP 模块这篇应该能帮你省掉几轮仿真和几次改版。1. 为什么要做 16 抽头信道预算与均衡任务拆解1.1 56G PAM4 接收链路的主要损伤56G PAM4 SerDes 接收链路面对的信号损伤主要可以分成四类插损、反射、串扰、还有器件本身带来的非线性。插损是主体FR4 走线和背板在 14GHz 左右每英寸的损耗非常可观一条超过 10 英寸的链路累计插损经常超过 20dB。反射来自连接器、via stub、封装边界这些阻抗不连续点会在脉冲响应上形成前驱和长拖尾。串扰在高速链路里也躲不开特别是相邻 lane 同时翻转的时候。这些损伤最终都会变成符号间干扰ISI。脉冲响应被拉长后当前符号会受到前面符号和后面符号的影响。FFE 的本质就是把 ADC 采样到的信号序列做一个反向卷积用一串延迟加权和去抵消信道的记忆效应。数字 FFE 的好处是滤波精度高、系数可自适应、不依赖模拟器件偏差坏处是它本质上是一个线性系统会把高频噪声放大后面还是会看到 DFE 来做闭环纠错。1.2 FFE 在 RX 均衡链路中的定位整个接收链路通常是这样的AFECTLE/VGA- ADC - 数字 FFE - DFE - CDR/解码。AFE 里的 CTLE 先把低频增益压低、高频抬起来做粗均衡同时把信号幅度调整到 ADC 满量程附近。ADC 采样之后进入数字域FFE 负责处理前驱和大部分长尾 ISIDFE 再处理剩余的几个主要后光标。损伤类型主要处理模块原因长尾 ISI / 前驱 ISI数字 FFE线性滤波能覆盖较长时延范围无错误传播残余后光标DFE决策反馈增益高针对主要后光标更有效高频衰减CTLE / FFE 联合模拟粗均衡降低数字域动态范围压力信号幅度波动VGA/AGC保证 ADC 输入不饱和、不欠驱动DFE 有一个先天问题错误传播。PAM4 判决错误之后反馈回来的错误符号会影响后续几个符号的判决。所以设计均衡策略时尽量让 FFE 把主要 ISI 先清掉DFE 只处理少量残余这样 DFE 的错误传播风险会小很多。这正是我在这颗芯片里坚持上 16 抽头 FFE 的根本原因——不是想堆系数而是要把 DFE 的工作量压下去。1.3 为什么是 16 而不是 8 或 32抽头数量是均衡能力和硬件成本的一场交易。16 个抽头在 28GBaud 下意味着要完成的乘累加次数是 16 × 28G 448 GMAC/s。如果做成 8 抽头那就是 224 GMAC/s32 抽头直接到 896 GMAC/s乘法器面积和功耗差不多翻倍。关键是这多出来的抽头到底能换来多少链路裕量。我当时的做法是把目标信道的 S 参数转成时域脉冲响应看主要 ISI 能量持续到多少个 UI。典型的一条 12 英寸背板链路脉冲响应在前 3 个前光标和 12 个后光标位置还都有明显能量再往后就逐渐沉入噪声底。16 抽头正好覆盖了这段范围3 个前光标加上 12 个后光标加上主光标本身。再多加抽头实测均衡增益每抽头改善已经不足 0.1dB却要付出成倍的硬件代价。少做 8 抽头DFE 的反馈阶数就得提高错误传播风险又会回来。16 是这个项目里最实在的平衡点。2. 数字 FFE 的顶层架构从 28GBaud 到可综合时钟域的映射2.1 时钟方案比较全速率、半速率还是四相并行28GBaud 的信号直接拿 28GHz 数字时钟去采样和滤波这在当前任何可综合流程里都是不现实的。SerDes 数字均衡的时钟方案通常从三分之一速率开始具体选几相要看工艺、功耗和时序收敛难度。方案数字时钟频率优点主要问题全速率28GHz结构最简单时序极端几乎不可综合半速率14GHz时序压力稍轻仍然非常紧张功耗高四相并行7GHz常用折中RTL 可处理需要处理跨相位样本复用八相并行3.5GHz时序宽松寄存器、乘法器和布线的代价明显增大我最终选择的是四相并行7GHz 主时钟。在比较先进的工艺节点下7GHz 逻辑还是可以收敛的只要控制好组合逻辑深度和扇出。八相并行最大的问题是每个时钟周期要处理 8 个符号输出每个输出都要做 16 次乘加相当于每周期要完成 128 次 MAC硬件并行度太高布局布线面积很难看。四相下每周期 4 个符号 × 16 抽头 64 次 MAC乘法器阵列数量约 64 个这个规模放到 SerDes DSP 的面积预算里是比较舒服的。2.2 相位折叠与跨相位样本复用这是数字 FFE 架构里最容易出错的地方。表面上看四相并行就是把进来的 4 个符号分给 4 条通路每条通路一条 16 抽头 FIR共用一个系数集合似乎很简单。但 FIR 滤波的本质是每个输出符号需要连续 16 个历史样本这 16 个样本不会老老实实落在同一条相位通路里。比如输出序号 n 需要 x[n], x[n-1], ..., x[n-15]而输出序号 n1 需要 x[n1], x[n], ..., x[n-14]。在四相并行下每周期进来 4 个新样本但每个输出需要的是一个跨相位的 16 样本窗口。如果每个相位只维护自己这一份延迟链那窗口数据就缺了隔壁相位的历史样本均衡结果会在相位边界处出现周期性抖动。正确的做法是做一个统一的样本窗口寄存器堆每周期整体移入 4 个新样本然后 4 个输出各自从这个窗口里按不同偏移读 16 个样本。这个结构我会叫它“相位折叠”意思是把 4 个并行相位的历史数据折叠到一个共享窗口里。实现上有两种常见方式一种是环形 FIFO 旋转读指针另一种是 16 级移位寄存器但是每级宽度是 4 个相位的数据每周期移动一次刚好覆盖 4 个符号的跨度。第二种结构更直观寄存器面积稍大但时序更可控我用的是这种方式。这里必须强调一点如果图省事把四个相位的 FIR 完全独立抽头链只在本相位内移位那么功能仿真可能都是对的——因为单个相位内部逻辑确实通。但等芯片回来的眼图测试你会看到明显的周期性眼图张开度变化误码率长测也会出现规律性跳变排查起来比一开始就做对要痛苦得多。2.3 定点化与数据位宽定点位宽是硬件设计里最直接的成本项。ADC 出来的数据按有效位数来算我用的 ADC 大约能到 6~7 个 ENOB实际数据位宽取 7bit 是合理的。系数位宽选了 10bit 有符号数这比 8bit 多出来的 2bit 不是浪费——FFE 的系数动态范围比很多人想的大尤其在高频深凹陷的信道中为了补偿陷波个别抽头系数会变得很大。8bit 有符号数上限 127对应归一化增益约 0.5 左右一旦超过就会饱和系数一旦饱和自适应环路的行为会变得很奇怪。乘加路径上的位宽更要注意。10bit 系数 × 7bit 数据乘积是 17bit16 个乘积累加之后中间结果理论上要求到 21bit 以上。我实际把累加器做到了 28bit多出来的位是给尖峰余量用的——信号里存在突发性大摆幅时累加器不会立刻溢出。输出端再按 DFE 和 CDR 的需要截断到 9bit 左右。截断的时候不要用简单的 floor 截断那样会产生直流偏置PAM4 的四个电平在直流偏置下会整体偏移等效噪声增大。我用的是收敛舍入round-half-to-even面积开销极小但实测下来 TDEC 可以改善 0.1~0.2dB。这个优化不起眼但在链路裕量紧张的时候就是压死骆驼的最后一根稻草。3. 系数怎么来LMS 自适应环路的工程化3.1 误差信号与 PAM4 切片器光有 FIR 结构系数是固定的那发挥作用非常有限。16 抽头 FFE 要真正好用必须有自适应。自适应常用的是 LMS最小均方算法核心就是每个符号周期计算误差 e[n] d[n] - y[n]其中 d[n] 是判决输出y[n] 是均衡后的信号然后用梯度下降法更新每个抽头系数。PAM4 的切片器比 NRZ 麻烦一点有 4 个目标电平比如归一化到 -3、-1、1、3判决阈值在 -2、0、2。切片器的参考电平会跟着 AGC 增益变化所以这里不能写死必须从 AGC 状态或实际电平统计里实时更新。我见过不止一次自适应发散的原因不是 LMS 算法本身而是切片器参考电平偏了误差信号全是错的。误差信号具体用哪种形式也有讲究。标准 LMS 用完整的 e[n] 和 x[n-k] 做乘积硬件上乘法器多。符号级 LMS 把两者都取符号变成纯粹的符号异或加减硬件极简但收敛速度会变慢、稳态噪声反而大一些。我这个项目里两种都用训练阶段用标准 LMS 的降精度近似进入跟踪阶段后转成带符号修正的简化 LMS这样既能保证初始收敛不会跑飞又能把跟踪时的硬件开销压下来。3.2 步长选择、泄漏因子与数值稳定性LMS 的步长 μ 是稳定性最敏感的单一参数。粗略的稳定性条件是 μ 2 / (输入信号功率 × 抽头数)。如果把输入信号功率归一化到 116 抽头时 μ 的理论上界就在 1/8 左右实用上必须留裕量。我用的是 1/32 起步收敛时再降到 1/256 做精细跟踪。步长不是越大越好步长大收敛快但稳态时系数会在最优值附近抖动等效于给链路额外注入噪声。另一个必须处理的机制是泄漏因子leaky LMS。信道响应里如果存在某个频点的深凹陷FFE 为了补偿这个凹陷会不断加大对应频段的增益系数可能缓慢发散。泄漏系数会让系数整体往 0 方向收缩一点对抗这种持续漂移。通常写成 h[k] h[k] × (1 - λ) μ × e × x。λ 的取值我用了 2^-12 这个量级实际效果是既不影响正常收敛速度又能长时间压制系数漂移。没有泄漏因子的 FFE 在长期高温老化的场景里容易出“慢性病”误码率不高但一直没有余量排查起来很费劲。系数更新的溢出保护也别忘记。定点 LMS 在系数接近边界时如果继续累加会直接翻转成相反的大数导致瞬时输出完全错乱。我在每个系数累加器后面加了饱和逻辑而不是让补码自然溢出。这个细节功能仿真不一定暴露因为功能仿真的比特模式很难恰巧触发溢出但真机长测大概率会遇到。3.3 与 CDR、AGC 的握手顺序链路建立阶段的初始化顺序是工程上最容易踩的坑也最容易被文档一笔带过。正确的顺序我认为是这样AGC 先调 VGA 增益把 ADC 输入幅度稳定在满量程附近CTLE 做粗均衡让眼图至少露出一条缝CDR 才能锁定到正确采样相位CDR 锁定后再用训练序列或 PRBS 让 FFE 跑 LMS 初始收敛最后等 FFE 稳定了放开 CDR 的跟踪环转到判决引导模式。为什么必须这么排因为 LMS 需要误差信号误差信号质量依赖采样相位而 CDR 的采样相位又依赖均衡后的眼图是否睁开。如果 FFE 和 CDR 同时启动就形成了一个正反馈追尾系统均衡器认为眼图没打开去调系数CDR 认为相位不对去调时钟两边都在动很容易出现极限环振荡。实际现场表现就是链路长时间 BER 不达标但单独看每个模块又都正常工作。有些架构里会设计成 CDR 锁定到参考时钟或者前馈时钟不依赖均衡后的眼图那初始化顺序可以不一样。但如果是典型的波特率采样 CDR我建议严格遵守“先眼图看见→再 FFE→最后松开 CDR”这个次序。这个经验是在双通道验证台上一轮一轮跑出来的顺序反了的话毛刺出现的时间和频率都没有规律非常难定位。4. 让 FFE 转起来验证环境与眼图指标闭环4.1 信道模型与激励构造验证 FFE 的第一步是把信道建模建准。我最常用的做法是拿实际背板或连接器的 S 参数文件转成时域脉冲响应再和 TX 端的前馈均衡、封装模型串起来构成一条完整的发送-信道-接收链路模型。S 参数里高频点的相位信息要保持足够好的分辨率如果 S2P 文件在 14GHz 以上只有稀疏几个点转出来的脉冲响应会缺高频细节FFE 验证得再漂亮也没有参考价值。激励信号方面PAM4 用 PRBS13Q 是比较主流的行规它包含足够的跳变模式和电平组合。我还要额外跑 PRBS31 的长序列来做误码率统计因为 PRBS13Q 的周期太短遇到 LFSR 周期和 FFE 抽头跨度产生相关性时可能会掩盖个别系数搭配下的偶发判决错误。真机上我们还会跑一部分 PRBS9 这样的短序列方便和示波器或者误码仪在特定触发模式下做眼图对齐。4.2 眼图、浴盆曲线与 TDEC 的判据PAM4 眼图测试和 NRZ 不一样。NRZ 看一个眼PAM4 要分成上、中、下三个子眼。光看眼图高度很容易误判因为三个子眼的张开度不同而且 CDR 的采样点会落在中间不能只看某一个眼。所以除了眼图高度和宽度我更依赖浴盆曲线和 TDEC。TDEC发射机色散眼闭合代价是把均衡后的眼图闭合程度折算成等效信噪比代价。典型的 400G 光模块规范里 TDEC 上限常给在 3dB 左右。做接收机内部验证时我会按同样的方法在数字 FFE 输出端测量“FFE 后的 TDEC”用来判断抽头数和位宽设定是否达标。设计目标是保证整个温度范围内 FFE 后的 TDEC 比链路预算低 1dB 以上否则后续 DFE 和 FEC 都会压力过大。眼图测试不要只看平均眼图一定要叠加看长时统计。我会在仿真环境里把 100 万个符号的均衡输出叠成眼图再从中截取若干 1 万个符号的片段单独叠眼。这么做是为了发现偶发的、占比例极小的眼图塌陷。这类塌陷在平均眼图里完全看不出来但恰恰是长测误码率突然劣化的元凶。4.3 行为模型与 RTL 联调的坑行为模型阶段我会用浮点 Python 和定点 C 模型各做一版先把算法验证清楚再让 RTL 去对照定点模型的结果。RTL 和定点模型的对照不是比对最终 BER 就够了而是要把每一级流水线的中间值都比对过。我之前遇到过一个问题定点模型里做了收敛舍入RTL 里因为一个拼接位写错变成了向下取整两边 BER 都很接近但 FFE 输出直流偏置差了半个 LSB。这种问题只在链路裕量边缘才会显现不逐级比对根本查不出来。RTL 联调还有一个经典坑是流水线延迟没有对齐。LMS 误差信号使用的 y[n] 必须和送入切片器的 y[n] 严格同一拍如果 FIR 在某一相位路径上多打了一拍误差信号对应的训练符号就错位了自适应结果会朝着错误方向收敛。我在 RTL 验证环境里专门加了一个 check自动比较每个并行相位上 y[n] 和 d[n] 的序号任何错位立刻报错。这个检查在功能仿真阶段能救回大量调试时间。5. 落地后的那些坑相位边界、系数更新与长测异常5.1 相位边界上的时序异常流片回来后第一轮测试眼图整体是好的但误码率长测里时不时出现周期性集中误码。抓出来的误码时间间隔和 4 相并行的符号周期完全吻合当时我就怀疑是相位边界问题。后来用片内探针去观察四个相位各自的 y 输出发现其中某一个相位在个别符号上会比其余相位晚半个射频时钟看起来像是边界组合逻辑路径太长导致的亚稳态。这里的根因其实在综合阶段就有苗头共享样本窗口的读地址扇出很大加上每个相位输出还要做 16 个乘法累加某些相位的时序余量就是比另一些相位差。修补时我没有去调综合约束而是直接在整个 FIR 输入前统一打了一拍对齐用流水线多余的一拍换所有相位的时钟余量。这是一个经典的“用延迟换时序”的思路。代价是 FFE 总延迟多了 35.7ps对接收链路完全没影响但时序收敛问题一下就消失了。5.2 系数更新与快速切换的安全机制调试自适应系数的时候我还踩过一个很隐蔽的更新顺序问题。芯片上有 16 个系数寄存器调试软件一般是通过内部寄存器逐个写入。如果不做处理用户在更新系数的过程中前几个抽头已经变成新值后几个还是旧值这时候 FFE 输出的抽头组合就是一个完全错误的滤波器均衡输出会出现明显的瞬态打嗝。这个打嗝时间很短但是会导致这几个符号全部判错。解决方法是加一组 shadow register也就是双缓冲。调试写入的时候只更新影子寄存器所有 16 个系数都写完之后统一发一个 commit 信号把影子寄存器的内容一次性锁存到工作寄存器。这个“一次性切换”保证了任何时刻工作系数都是一组完整有效的值。冻结系数的时候顺序也不要反先冻结自适应使能再写影子寄存器最后 commit。如果先写再冻结最后两拍之间自适应环路还在跑工作系数可能已经被 LMS 改掉了。5.3 温度漂移与自适应回退芯片从常温跑到高温背板插损会变化信道响应也跟着漂。实测下来主光标附近的几个抽头系数漂移幅度可以达到百分之二到百分之三。如果自适应步长设得太小这些漂移没法及时跟踪误码率短期内不差但 TDEC 余量会持续下降时间长了可能直接越过 FEC 纠错能力边界。我给自适应环路设计了分档步长正常跟踪用 1/256 的小步长当收敛误差监测到持续增大自动升到 1/64 的中步长再不够就升到 1/16 的大步长。回退的时候必须加迟滞避免在边界上来回切换。这个思路类似电源系统的动态调压升档要快降档要稳。实际测试中温度斜坡场景下 FFE 后的 TDEC 波动能压住不会出现系数切换引起的突发误码。5.4 长测过程中的偶发突发错误最有意思的调试发生在一次 72 小时连续 PRBS31 长测中大约每几十分钟出现一次连续几个符号的突发错误。抓出来看每次突发错误都伴随一个 FFE 输出尖峰但尖峰的幅度又明显地超过正常 PAM4 电平范围。这个现象不是 FIR 滤波器逻辑能解释的——FFE 是线性系统输入没有尖峰输出不可能凭空出现尖峰。顺着往模拟前端排查我用片内的 ADC 饱和统计计数器发现尖峰来临前 ADC 已经出现了短暂的饱和原因是串扰耦合过来的高频毛刺把信号瞬时推到满量程外。FFE 只是把这个毛刺进一步放大了。这个坑说明数字均衡器可以修复信道色散但救不了模拟前端的削波。后续我在 FFE 输出加了异常电平监测一旦检测到超范围样本就通知 CDR 和链路状态机进入短暂重收敛流程避免整套系统被几个毛刺带偏。类似的偶发问题如果只盯着数字域查永远找不到根因。高速 SerDes 是一个完整的信号链模拟前端、ADC、数字均衡、CDR 任何一个环节的偶发非线性都可能以数字域看过来像“随机误码”的形式出现。FFE 设计完成后回头再和 AFE 一起做联合异常注入测试是我强烈建议加的一步能省下大量“看起来是 DSP bug、其实是前端饱和”的排查时间。这个 16 抽头 FFE 从前期信道预算到流片验证前后迭代了三轮。回头看真正的经验集中在两点一是多相并行 FIR 的跨相位样本复用必须在一开始就做对二是自适应环路的启动顺序和系数更新机制要在设计阶段当成主线问题来考虑而不是等芯片回来再打补丁。后面继续做 112G PAM4 SerDes 的话这些坑大概率还会换一种形式出现但这个项目的经验和测试方法能直接搬过去用。
返回列表