做56G PAM4 SerDes接收机绕不开均衡器设计尤其是ADC之后的数字均衡部分。我们团队在做RX链路方案定型时把16-tap数字FFE作为均衡链路里的核心模块来推做了前后快一年的RTL实现、算法收敛调试和硅后验证。这篇文章把这套设计的思路、参数选定、工程化细节和踩坑记录整理出来给正在搞高速SerDes数字接收机、或者准备接手PAM4 DSP模块的工程师作个参考。先说清楚这个模块是干什么的。56G PAM4链路的符号率是28Gbaud每个符号携带2bit信息奈奎斯特频率到14GHz。背板信道在这个频点上插损动不动就是20到30dB再加上反射、串扰和封装不连续接收端拿到的信号眼图基本是闭死的。CTLE能在模拟域拉回一部分增益但对长拖尾和反射这类跟信道记忆强相关的损伤处理能力有限。这时候数字域均衡就必须上。16-tap数字FFE本质是一个16阶横向滤波器用当前符号前后共16个采样点做加权求和把信道的线性损伤一一对冲掉。这个模块能不能收敛、能不能在56G吞吐率下跑通时序基本决定了整个RX DSP链路能不能工作。1. 为什么56G PAM4接收机绕不开数字FFE1.1 PAM4的信道环境远比NRZ恶劣很多从25G NRZ切到56G PAM4的工程师一开始都会低估信道劣化程度。NRZ时代28Gbps已经是噩梦难度但好歹电平间距是满幅的判决一个bit只需要跟一个阈值比较而PAM4是把0dB到-6dB的电压范围切成四个电平判决需要三个阈值相邻电平间距直接缩到NRZ的三分之一。换句话说同样的ISI幅度压下来PAM4的信噪比预算要比NRZ紧张大约9.5dB尽管符号率减半会收回一部分带宽优势实际净损失也在4到5dB左右。这决定了接收机不能只靠模拟均衡硬扛必须借助数字域的精细补偿。另一个容易被忽视的问题是信道冲击响应的拖尾。长背板信道的群时延波动和阻抗失配会在脉冲响应上拉出一长串低幅度“尾巴”如果这尾巴延伸到三四个UI以外光靠CTLE那种提升高频的整形方式没法干净地消掉反而会放大高频噪声。数字FFE的好处是抽头权重可以任意配既能压前标pre-cursor也能压后标post-cursor适应各种形态的冲激响应这是模拟均衡器很难做到的灵活性。1.2 模拟前端能做什么、做不到什么RX模拟前端中的CTLE一般提供6到12dB的峰值增益在奈奎斯特频率附近抬高频响应配合AC耦合把低频滚降掉用来抵消一部分信道插损。再加上自动增益控制AGC把信号幅度压到ADC满量程附近。这套模拟链路的贡献是把信号从“完全闭眼”拉到“勉强能看到残影”但残影不代表能直接判决剩下的ISI必须靠数字域做精细切除。CTLE的局限在于它只能做一种固定的频率整形没办法针对信道的具体冲激响应逐点补偿。而且模拟均衡的线性范围有限增益开太大非线性失真会把PAM4电平分布扯歪四个电平的间距不再均匀后续ADC和解调都会吃亏。数字FFE则没有这类线性度问题系数位宽做足之后它可以在量化精度允许范围内逼近信道的逆响应。1.3 数字FFE在均衡方案矩阵里的定位接收端均衡有三大经典方向线性均衡FFE、判决反馈均衡DFE和最大似然序列估计MLSE。MLSE性能最好但复杂度随信道记忆长度指数爆炸56G速率下基本没机会用在线性产品里。DFE是消除后标ISI的利器没有噪声放大问题但级联反馈路径的时序收敛在28Gbaud上极其痛苦尤其PAM4这种多电平判决反馈路径上的逻辑延迟预算被压到一两百皮秒以内大多数设计只能做到少数几个tap。数字FFE虽然会放大噪声和串扰但它结构规整、完全流水线化没有任何反馈路径并行度可以做得很高在14GHz奈奎斯特频率下也能收敛。工程上比较常见的方案是“CTLE ADC 数字FFE 少量tap的DFE”混合架构FFE负责把主ISI压缩掉DFE负责补齐残余的后标尾巴。这样既避开了DFE反馈路径的时序极限又不会让FFE的噪声放大失控。我们这套56G方案用的就是这种组合16-tap FFE打主力后面挂一个1到2 tap的DFE做残差清扫。2. 16-tap 数字FFE整体架构设计2.1 采样率与ADC位宽怎么定数字FFE跑在ADC的输出侧所以先得定ADC方案。56G PAM4接收机里ADC采样率一般取符号率即28GS/s叫1倍过采样也有做2倍采样的56GS/s能提供更好的相位裕量但功耗和面积几乎翻倍。我们综合成本和收敛裕量后选了1倍过采样后续DSP靠数字插值去调采样相位。ADC位宽放在6bit这在新一代高速ADC里算功耗和性能比较平衡的点。6bit量化带来的信噪比损失大约在6到8dB看起来很吓人但配合接收端的均衡后处理只要量化噪声不过早淹没信号整体BER还是能靠后级纠错找回来。实际上位宽再往上到7bit或8bit对BER的改善有限功耗代价却是非线性的。做方案时我们做过一轮链路仿真曲线对比6bit和7bit在信道插损22dB场景下TDECQ差距不到0.3dB但ADC功耗差了接近30%。最后选6bit。2.2 16-tap的窗口长度和抽头排布FFE抽头数量的选择本质上是让均衡窗口覆盖信道冲激响应的主要能量范围。28Gbaud下一段30英寸背板信道的脉冲响应拖尾能延伸到8到12个UI再加上封装和连接器反射影响范围可以到15个UI以上。16个tap意味着均衡窗口覆盖16个符号周期足够把绝大多数线性ISI压到系统目标以内。抽头排布有个惯例主抽头main tap通常放在中间偏后的位置前面留2到4个tap处理pre-cursor后面留11到13个tap处理post-cursor。pre-cursor来自信道响应的前向尾巴量级不大但很影响眼图对称性post-cursor是主要的ISI能量来源。我们定的是2个pre-cursor、1个main、13个post-cursor。这个排布不是拍脑袋来的是对3966型号背板信道模型跑完扫参后框出来的再往前加tap对眼高的改善小于0.2%而功耗、面积线性增加性价比已经不划算了。2.3 并行化架构时间切片配乘加阵列28GS/s的符号速率在数字逻辑里没法做成单周期单位置处理。RTL跑在700MHz左右硬件上必须做40路甚至更高的并行度。做法是把ADC输出的高速串行数据流按时间切片拆成N个并行子帧每个子帧对应一个FFE通道。关键点是16-tap的均衡窗口会横跨相邻子帧边界所以每个子FFE通道需要从相邻通道借用历史采样数据。实际RTL里用一组移位寄存器网络来管理窗口数据每周期进来N个新样本同时向外吐出16个滑动窗口组合。每个子通道的核心是一个“16输入乘加单元”16个乘法器并行做系数乘以采样值再用加法树把16个部分积加到一起。乘法器位宽取系数10bit乘数据6bit乘法结果16bit加法树每级做符号扩展最后在输出端截位到10bit左右方便后续DFE处理。这个架构的好处是乘法器阵列完全规整后端布局布线可以把16个乘法器摆得很密时序容易收敛。3. 实现细节与工程化优化3.1 乘法器怎么省CSD系数与移位加减运算16个乘法器并行工作乘法器面积占据整个FFE模块的六成以上。系数在收敛后基本是小数绝对值范围通常小于1因此乘法可以用“移位相加”近似不必用通用乘法器。我们用了CSDCanonical Signed Digit编码把系数表达成2的幂次加减的集合再用若干级移位器和加法器组合出结果。一个10bit系数在CSD编码下非零位平均只有3到4个等价于3到4次移位加操作比用乘法器省掉一半以上的面积。对功耗敏感的设计加法单元还可以结合门控时钟和数据翻转率优化。乘法器输出端加一个清零检测如果系数为0就跳过该路乘法直接输出0。实测下来链路稳态工作时有一部分post-cursor系数的绝对值很小清零检测能把那几路乘法器的动态功耗压下去一截整体功耗能省8%到12%。3.2 加法树与流水线切分16个部分积相加直接做成单级16输入加法器组合逻辑深度会冲得很高700MHz时序大概率过不了。工程上要切流水线第一级用4组4输入加法器用进位保存加法器CSA实现把16个部分积压成8个第二级再压成4个第三级用超前进位加法器CLA把4路合并成最终结果。算下来关键路径从寄存器到寄存器大约三个加法器深度在7nm工艺上留出周期裕量之后可以跑到800MHz以上。流水线切分要特别注意符号扩展和截位策略。第一级加法器把6bit数据乘10bit系数后的16bit结果做符号扩展扩展到位宽21bit再相加避免进位溢出导致符号错误。中间级保留20bit最后一级截位到12bit时要做饱和截位而不是简单舍入否则信号幅度大的时候会出现严重的非线性失真PAM4眼图会歪掉。3.3 系数接口与上下电时序16个系数存放在一组可读写的寄存器里通过APB总线配置。设计时必须考虑两套系数值当前生效系数shadow和配置暂存系数active。固件在链路训练阶段反复写暂存系数等训练收敛后通过一个“apply”脉冲一次性搬移到生效寄存器。这个机制避免在系数更新过程中出现半个FFE窗口混用新旧系数的边界毛刺。上下电时序是另一个容易踩的坑。FFE模块的时钟由高速SerDes时钟树提供如果上游PLL还没锁定就开启FFE所有寄存器会进入未知状态后续固件读回来全是乱值。我们做法是在时钟稳定后先给FFE所有寄存器复位再等ADC输出有效标志拉高最后才允许加载初始系数。这套时序在启动流程里是硬编码状态机控制的不允许固件跨过。4. 系数自适应与收敛控制4.1 LMS更新公式在16-tap FFE里的具体形式系数训练用的还是最经典的LMS最小均方算法公式写出来是w_k(n1) w_k(n) μ * e(n) * x(n-k)其中w_k是第k个tap的系数k从0到15x(n-k)是延迟k个UI的输入采样值e(n)是误差信号μ是步长。这里的误差信号不是简单拿目标值和输出相减因为PAM4有四个判决电平要先把均衡后的信号y(n)映射到最近的PAM4电平d(n)再算e(n) d(n) - y(n)。系数更新速率没必要跟28Gbaud符号率保持一致否则功耗扛不住。我们把误差信号先做了64倍下采样再送到系数更新单元相当于系数每64个符号才更新一次。LMS收敛带宽大概在几百kHz级别完全足以跟踪温度漂移和电源电压波动引起的信道慢变。步长μ在训练开始时取大一点加快收敛等误码率降到一定阈值后切到小步长做稳态跟踪这个两段式训练对PAM4尤其重要大步长能快速跳出盲区但残留稳态误差会压眼高必须切小节流。4.2 收敛启动流程先CTLE后FFE的时序真正上电跑训练的时候收敛流程不是上来就调16个系数。顺序是这样的先把CTLE的峰值频率和增益粗调到目标信道插损对应的档位观察ADC输出幅度到正常范围接着固定CTLE配置开始跑FFE系数LMS初始系数全部归零只留主抽头为1。这样系统先从“不均衡”状态逐步逼近最优解比同时调CTLE和FFE稳定得多。训练序列辅助是必须的。我们内部用一个定制的PRBS13Q训练码型经过信道后由接收机相关器恢复出参考序列送给误差计算模块。PAM4的多电平特性决定了盲均衡收敛很慢尤其在信号眼图完全闭合的阶段光靠判决反馈误差会一直在错误电平上打转。有了训练序列误差计算变成“有导师”模式收敛速度能快一个数量级。4.3 稳态跟踪与环路带宽的折中链路进入正常工作模式后FFE系数不能锁死还得继续做自适应跟踪。这里有个矛盾点跟踪带宽开得太大会不断吸入高频噪声让系数的抖动转嫁到输出信号上眼图发毛带宽开得太小跟不上电压和温度变化长时间跑下去BER会缓慢恶化。工程上的折中是把稳态步长设为训练步长的五分之一同时给系数更新加上死区——误差绝对值小于一定阈值时停止更新这样系数在最优值附近会有个“静默区”输出信号的确定性抖动能降下来。我们实测过一组数据跟踪带宽设为500kHz时输出眼高较1MHz带宽版本反而高了3%左右原因是高频抖动被滤掉了。这个经验不一定适用所有信道但方向是对的——PAM4系统里控制系数的抖动跟控制信号本身的抖动同等重要。5. 验证、调试与测试要点5.1 仿真怎么打从MATLAB模型到RTL的bit-true比对数字FFE这种模块绝不能直接拿RTL去跑几十微秒的链路仿真仿真时间不可接受。我们的流程是先在MATLAB/Simulink里把整个RX DSP链路搭起来其中就包含16-tap FFE模型用真实信道响应数据跑通得到系数收敛曲线和输出误码率。然后把这个模型转成定点C模型再做SystemVerilog的RTL仿真用C模型生成黄金向量比对RTL输出。bit-true比对这一步最容易出问题的是截位误差的传播。RTL里每一级加法器都有具体的截位策略C模型必须跟RTL完全一致否则比对到第二级就崩。我们建了一个“截位描述表”把每一级加法器的输入位宽、输出位宽、饱和/舍入策略都记录下来C模型和RTL都用这张表驱动。这块细节决定了整个验证效率搞不好就在无休止的RTL debug里浪费时间。5.2 硅后调试中的寄存器读回与固件协作芯片回来之后FFE的硅后调试跟数字前端不一样很多现象只能是间接观测。寄存器读回是最基本的调试手段把16个系数、输入幅度统计、误差RMS值都映射到可读寄存器固件周期性读回来打印。这里有个经验系数寄存器必须额外保存一份“训练初始值”和“当前值”这样出问题时能对比出到底训练过程有没有更新系数还是更新了但没生效还是生效了被后续流程覆盖了。另外ADC输出端的信号质量对FFE调试影响极大。如果FFE输出眼图差不一定是FFE本身有问题可能是ADC的采样相位偏了、交织通道之间有增益失配。一定要先把ADC的数字后台校准跑完把交织失配调到可接受范围再来谈FFE调试。顺序反了会陷入调系数永远调不好的死循环。5.3 眼图与误码率的关系、浴盆曲线怎么读PAM4眼图和误码率的关系比NRZ复杂因为它有三个垂直眼分别对应四个电平之间的跳变区间。我们在测试时会同时观察上、中、下三个眼的EH眼高和EW眼宽以最小的那个眼作为系统裕量的瓶颈。如果三个眼高度参差不齐多半是信道非线性或者FFE的系数收敛方向有偏置需要通过误差统计调整个别tap的权重。浴盆曲线是硅后最常用的判定手段之一。扫描采样相位把每个相位点上的BER画出来曲线越宽说明时序裕量越大。实测中FFE调好之后浴盆曲线的底应该平滑且低于1e-15量级。如果曲线中间有凸起通常是某个特定tap的系数存在周期性的抖动噪声这时候回头查系数更新模块的降采样逻辑是否跟数据帧边界对齐经常能发现误差信号里混入了周期性毛刺。5.4 常见问题速查表我在下面整理了一份我在56G PAM4 RX数字FFE调试中反复遇到且代表性较强的问题清单格式是“现象—原因—处理”做现场bug排查时可以直接套用。现象可能原因排查方向FFE输出眼图发毛但CTLE眼图正常系数更新步长过大稳态跟踪噪声转化到输出调小稳态步长加大误差死区训练过程系数发散到±1边界LMS步长过大或训练序列相关质量差减小μ检查训练序列的幅度归一化三个PAM4眼高度差异明显CTLE增益档位不匹配或ADC量化噪声非均匀重新粗调CTLE检查ADC各交织通道失配浴盆曲线底部凸起超过1e-12误差信号周期性毛刺多半是降采样边界未对齐检查误差下采样单元的帧同步信号系数写进去不生效生效寄存器未收到apply脉冲检查APB接口的触发时序确认shadow到active的搬移复位后寄存器读到全F时钟未稳就开启了FFE区块按状态机先等待时钟锁定再释放复位功耗超标热点在乘法器区域部分系统数接近无效位宽上限动态翻转过多查看系数分布考虑CSD编码后再优化写在最后做16-tap数字FFE这个模块回头看最深的体会是真正的难度不在算法也不在RTL本身而在于把算法映射到硬件时每个环节的取舍。比如16个tap的排布仿真软件不会告诉你哪个排法最省功耗乘法器用CSD编码文档里写得高大上实际是说白了就是拿面积和精度换功耗LMS的步长切换策略不同信道差异巨大必须靠实测数据去校准。如果正在做类似项目我强烈建议在项目早期就把“仿真平台到硅后调试的完整数据链”打通。FFE这种模块一旦上了真实的背板信道很多在仿真里完全想不到的非理想因素会冒出来。没有一条能快速把硅后观测数据和算法模型对应起来的通路排查问题会很痛苦。这套16-tap数字FFE设计目前已经在我们56G PAM4 RX方案里跑通了环回模式、背板测试和误码率测试结果都达到预期。后续如果要做112G本质思路可以延续但抽头数量、并行度、系数位宽都得再往上提一档功耗和面积的账得重新算。这些是后话了先把当前这版的经验沉淀好后面再聊新的坑。