数字部分 2.3 MAC 加扰解扰

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

  1. K‑Code 旁路 ——高速路径避免对控制符号做 XOR:

    assign bypass0 = (scrambler_disable | i_datak[0]);
  2. 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,与规格书一致。
  3. 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 描述完全吻合。
  4. 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 /clk2 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  小结

  1. 目的:Scrambler 通过 LFSR 把数据随机化,改善 DC、EMI 与 CDR。
  2. 规范要点:16 位多项式、COM 复位、SKP 不推进;多 Lane 必须同相位;只能在配置阶段后禁用。
  3. 代码落地:Synopsys ku5p_scramble_slv 精确再现了规范逻辑,K‑Code 旁路、COM 复位、8 bit 并行移位等均可直接对照标准。
  4. 调试:关注 LFSR 同步、Deskew、Skip Remove;善用 IP 的 scrambler_disable, rxskipremoved, deskew_complete 等信号。