PCIe SerDes 全流程实战
数字部分——MAC-加扰解扰
本项目聚焦于高速串行通信本身。PCIe 作为广泛应用的高速串行通信协议,其历史悠久,协议栈层次多、设计复杂;Synopsys IP 更是在工业级别上对 PCIe 协议做了完整实现。
因此,本文 不 针对数字逻辑的每一个细节展开说明;若需深入,可结合 SystemVerilog 代码与波形自行学习。
个人经验
- MAC 层作为 PCIe 架构的重要组成,对上衔接 Data Link 层,对下通过 PIPE 接口连接 PHY 模块。
- MAC 层的核心目标是在与 PHY 层协同的基础上,构建一个能够稳定传输数字信号的层次。
- 加扰/解扰用于保证直流平衡。直流平衡属于电气层面的要求,在 HDMI 协议中也有对应实现。除 CDR 外,还需综合考虑寄生电容,EMI等因素。
以下内容为O3-Pro对system verilog代码和标准文档的深度总结
1 何谓 Scrambler / Descrambler?其在 PCI Express 中的地位
在任何高速串行链路中,保持频谱均匀度与时钟数据恢复 (CDR) 的稳定性都至关重要。
PCI Express (PCIe) 的物理层(PHY)把 Scrambler 放在发射方向的最末端,在 8b/10b(Gen1/2)或 128b/130b(Gen3 及以上)编码之前,把待传输的每个字节与一个伪随机序列异或;而接收方向的 Descrambler 则在解码之后执行逆运算。
“Scrambling is applied to characters prior to the 8b/10b encoding. On the Receive side, de‑scrambling is applied after 8b/10b decoding.” ——PCI Express Base Specification v5.0, §4.2.1.3
1.1 为什么必须 Scramble?
原因 | 影响 | Scrambler 的作用 |
---|---|---|
消除直流分量 (DC balance) | 长 1/0 连续比特会使信道出现基线漂移 | XOR 后比特流统计均衡 |
分散能量、降低 EMI 峰值 | 连续重复模式在频域形成尖锐谐波 | 伪随机序列将能量展宽 |
保证 CDR 边沿密度 | 连续相同符号导致接收端锁相环失锁 | 无规则长序列概率被强烈抑制 |
测试/调试可控性 | 关闭 Scrambler 需要可重复固定图案 | TS1/TS2 中的 Disable Scrambling 比特提供此能力 |
2 规范层面:LFSR、多 Lane 协同与状态机
2.1 LFSR 多项式与初始化
标准指定一个 16 位 LFSR,多项式:
[ G(X)=X^{16}+X^{5}+X^{4}+X^{3}+1 ]
“The COM Symbol initializes the LFSR … The initialized value … is FFFFh.” ——PCIe v5.0 §4.2.1.3
- COM(K28.5)符号一离开发射端 LFSR,LFSR 立即置为 FFFFh;接收端检测到任意 Lane 上的 COM 时同样复位。
- SKP、所有 K‑code、Ordered‑Set 中的 D‑code 均不参与 LFSR 推进。
- 在多 Lane 链路中,每个 Lane 保持“同时刻”LFSR 值一致;实现可以是一份共享 LFSR,也可以是 N 份并行 LFSR。
2.2 何时可以/必须关闭 Scramble
- 仅在 Configuration 结束后才允许关闭;
- TS1/TS2 的
Disable Scrambling
位只为 测量与调试预留; - 在 Loopback Slave 模式下一律不做 Scramble(保证环回数据与外部一致);
- LTSSM 处于
Detect
时状态机默认开启 Scramble——确保最早阶段就具备良好的频谱特性。
3 Synopsys IP 代码详解——从寄存器到门级
本节选取
ku5p_scramble.sv / ku5p_scramble_slv.sv
为例,穿插引用原码并结合规范梳理数据流。
3.1 顶层模块 ku5p_scramble
ku5p_scramble
#(.CALC_PARITY_BEFORE_SCRAMBLE(1))
u_scramble (
.scrambler_disable (smlh_scrambler_disable),
.data_dv (rpipe_rxdata_dv),
.data (rpipe_rxdata),
...
);
scrambler_disable
直接受smlh_scrambler_disable
控制,比规范要求的 TS1/TS2 位更上层(可由软件寄存器驱动)。- 该模块既用于 TX(CALC_PARITY_BEFORE_SCRAMBLE=0)也用于 RX(=1),通过参数化控制方向差异。
3.2 Slave 级实现 ku5p_scramble_slv
-
K‑Code 旁路 ——高速路径避免对控制符号做 XOR:
assign bypass0 = (scrambler_disable | i_datak[0]);
-
COM 复位 LFSR:
assign comma0 = (i_datak[0] && (i_data[7:0] == `ku5p_macro_COMMA_8B)); assign lfsr_adv8 = comma0 ? 16'hFFFF : skip0 ? lfsr : adv8_1dot0a(lfsr);
- 当检测到 COM,下一拍 LFSR 立即回到
FFFFh
,与规格书一致。
- 当检测到 COM,下一拍 LFSR 立即回到
-
8 bit Scramble 函数:
function [7:0] scramble8_1dot0a(input [15:0] lfsr_bit, input [7:0] inbyte_bit); scrambit[k] = lfsr_bit[15-k]; scramble8_1dot0a = scrambit ^ inbyte_bit; endfunction
- 逐比特映射 LFSR[D15…D8] 至数据 D0…D7,与图 4‑10 描述完全吻合。
-
LFSR 快速移位
adv8_1dot0a
adv8_1dot0a[0] = bit_in[8]; adv8_1dot0a[3] = bit_in[11] ^ bit_in[8]; ...
- 同时完成 8 bit 滚动,与多项式 (X^{16}+X^{5}+X^{4}+X^{3}+1) 对应的反馈抽头。
- 确保 1 symbol /clk 或 2 symbol /clk 均能在一个时钟内算出下一个 LFSR。
3.3 RX 路径串联关系
PIPE → rmlh_pipe → ku5p_scramble (Descramble) → ku5p_rmlh_deskew → ku5p_rmlh_pkt_finder
- 在
rmlh_pipe
中首先把物理 PIPE 信号对齐到字节级。 - Descrambler 去除随机化后,才能进行 Lane‑to‑Lane Deskew;否则 SKP/COM 等关键符号无法识别。
rmlh_deskew_bypass
=1(Gen3 以上或外部 PHY deskew)时,数据直接流向pkt_finder
,但 descramble 仍然执行,因为 128b/130b 也使用基于乘法器的 scrambler。
4 实战:调试与验证技巧
场景 | 观察点 | 典型症状 | 解决思路 |
---|---|---|---|
链路无法训练到 L0 | rpipe_all_sym_locked 未置位 |
误把 Scramble 关闭或 LFSR 失步 | 通过 LA 采集 COM → FFFFh 复位过程,确认 LFSR 同步 |
偶发 CRC/LCRC 错误 | rmlh_rdlh_pkt_err 激增 |
某 Lane 偶尔漏掉 SKP 导致 LFSR 位移错位 | 打开 rmlh_deskew_alignment_err 统计,配合眼图排 EMI |
实验室串扰测试[EMI] | 谱分析仪峰值 > 规定 | Scrambler 被禁用(测试模式) | 确认 TS1/TS2 的 Disable Scrambling 清零 |
制造测试插装 | 需要固定图案 | Scrambler Off & 插入已知 Payload | 利用 scrambler_disable 直通固定序列,比对环回 |
5 延伸:128b/130b Scramble(Gen3+)与 8b/10b 的差异
- 位置:在 Block Encode 之后,仍为异或 + LFSR;但 Sync Header (2 bit) 永远不乱序。
- 多 Lane 同步:EIEOS 序列在训练过程中带来唯一比特图样,用于对齐 Block ‑> 此时所有 Lane 的 LFSR 也同步到同一阶段。
- 实现:Synopsys IP 通过参数
GEN3_REGIN/REGOUT
选择是否在 Scramble 前后加寄存器,以平衡时序。
6 小结
- 目的:Scrambler 通过 LFSR 把数据随机化,改善 DC、EMI 与 CDR。
- 规范要点:16 位多项式、COM 复位、SKP 不推进;多 Lane 必须同相位;只能在配置阶段后禁用。
- 代码落地:Synopsys
ku5p_scramble_slv
精确再现了规范逻辑,K‑Code 旁路、COM 复位、8 bit 并行移位等均可直接对照标准。 - 调试:关注 LFSR 同步、Deskew、Skip Remove;善用 IP 的
scrambler_disable
,rxskipremoved
,deskew_complete
等信号。