1. 工作速率与链路位置
50G PAM4 模式下数据速率 53.125 Gb/s,符号率 26.5625 GBd,1 UI = 37.647 ps。
MMCDR 是基于 ADC 采样的波特率时钟恢复(baud-rate CDR)。它每个符号只用一个数据采样点,通过相邻 ADC 采样值和 PAM4 判决值来估计采样时钟偏早还是偏晚。它不使用 CDR CTLE 后面的四路 edge/data sampler,也不复用 BBCDR 的 XOR early/late 事件。
数据流如下:
text
VGA2 -> ADC -> offset-binary 转 signed + channel offset / bit mask
| |
| +-> 16-tap FFE -> DFE / FFE hard decision
|
+-> latency-matched ADC samples
-> cursor alignment + block history
-> 16 路 Mueller--Müller cross-product
-> sign vote
-> MM-PI / MM-DCO 数字环路
一个 adc_clk 周期包含 32 个 7-bit signed ADC sample,MM detector 每周期形成 16 个相邻样点误差并做一次方向投票。投票结果送入 12-bit PI 环路与 18-bit DCO 环路,分别调节采样相位与振荡频率。
2. DFE mode 与 FFE mode
MMCDR 有两种判决来源,默认 mmcdr_mode_dfe0_ffe1=0:
| 模式 | 采样值 | PAM4 判决 | 说明 |
|---|---|---|---|
0,DFE mode |
adc_data_dadj,32 路 7-bit signed |
data_dfe,32 路 2-bit |
使用 1-postcursor speculative DFE 的最终判决 |
1,FFE mode |
adc_data_ffe_dadj,32 路 7-bit signed |
data_ffe,16 路 2-bit |
使用 FFE 输出直接经过三门限量化的判决 |
两种模式都用 ADC 采样值做乘法,只是配对的判决来源和流水线延迟不同。FFE mode 不是把 11-bit FFE 输出直接送进乘法器;FFE 输出只用来产生 16 个 hard decision。
寄存器说明要求:选 FFE mode 时,应关闭 DFE tap1,并让 FFE tap1 承担相应的第一后游标补偿。否则判决路径和送入 MM detector 的 ADC 脉冲响应对不上,误差零点可能被残余 ISI 移动。
PAM4 判决在 MM 模块内部转换成 signed level:
text
00 -> -3
01 -> -1
10 -> +1
11 -> +3
所以 MM detector 实际用的是判决电平 ±1、±3,不是 Gray bit 分别参与相关运算。precode / Gray decode 在 DFE 输出之后,不进入定时误差计算。
3. Mueller--Müller 定时误差
这里不展开教科书上的统计推导,直接看 RTL 实际计算:
text
e[k] = adc[k] * decision[k+1]
- adc[k+1] * decision[k] k = 0...15
这个式子和常见的 MM 相位检测公式只差索引选择和整体符号。不要脱离 mmcdr_pi_polarity_inv、DCO 极性连接以及 PI/DCO 对 code 的实际响应,单独把 e[k] > 0 固定解释成"clock early"或"clock late"。闭环只要最终控制方向构成负反馈就行。
4. ADC 流水线与 cursor 对齐
ADC 原始 7-bit offset-binary code 先减去 64,再减每通道 6-bit offset code;adc_bit_mask 可以清零若干低位。结果超出范围时饱和到 +63 或 −64,然后进入数字流水线。
为了匹配不同判决路径,ADC 数据通路提供两组延迟:
- FFE mode 用
adc_data_d3r,即adc_data_ffe_dadj; - DFE mode 用
adc_data_d6r,即adc_data_dadj。
cursor_sel[5:0] 在 symbol 维度调整 ADC 与 decision 的相对位置:
cursor_sel |
ADC 相对判决延迟 | 对应 FFE 游标配置 |
|---|---|---|
100000 |
0 UI | 0 个 precursor |
010000 |
1 UI | 1 个 precursor |
001000 |
2 UI | 2 个 precursor |
000100 |
3 UI | 3 个 precursor |
000010 |
4 UI | 4 个 precursor |
000001 / default |
5 UI | 默认 C10 游标,5 个 precursor |
cursor_sel 只改变 MMCDR、CTLE 训练等逻辑看到的数据对齐位置,不会自动移动 16-tap FIR 的主系数。改它的时候必须同时把 FFE cursor hint 和训练 mask 移到对应 tap。
5. 跨 block 历史与 16 路 vote
为了让 32-symbol block 边界处保持连续,MM 模块保存上一 block 最后的 6 个 ADC sample,以及最后一个 2-bit decision。当前数据与历史拼成 33 点对齐窗口,再取其中连续 17 点生成 16 个相邻 cross-product。
每路完整乘积差先压缩成三值方向:
text
e[k] < 0 -> -1
e[k] = 0 -> 0
e[k] > 0 -> +1
然后做一次并行投票:
vote=∑k=015sign(ek),vote∈−16,+16 vote=\sum_{k=0}^{15}\operatorname{sign}(ek),\qquad vote\in-16,+16 vote=k=0∑15sign(ek),vote∈−16,+16
RTL 最终只寄存 vote 的符号位并送给 PI、DCO 两个环路,绝对值被丢弃。所以 +1 和 +16 对下一次数字更新给出同一个方向;环路增益由后级 gain code 和 accumulator 决定,不由 vote 幅度决定。
平票也没有独立 dead zone。vote=0 的符号位为 0,会进入"非负"分支并产生一个确定方向的更新;只有关闭相应环路或把 gain 设为 0 才会真正 hold。验证时不能假设正负票数相等就自动停止 PI/DCO。

