光电链路训练
光电链路训练
前言
遇到的困境
终于来到了最终关卡,是我这两年来一直想做,但却一直只做了个半吊子的工作——完整光电链路训练。
以前一直在找平台做这件事,有段时间用的是 ADS + VPI 平台,但问题是这个平台对链路训练的支持极差。它只负责计算波形输出,但输出的波形直接交给 Channelsim 中的 Rx 会出问题。
我曾花了很多精力解决这个麻烦,想将 VPI 导回 ADS 的波形重新用 ADS 中的 Rx 去均衡。但这么做不行,因为我这边的 IBIS-AMI 模型属于脉冲自适应型,而非波形自适应。"波形自适应"指的是模型在 AMI_GetWave 流式处理过程中,根据它看到的信号统计去调 CTLE/DFE 系数。
- 脉冲自适应 / pulse based:CTLE/VGA/FFE/DFE 的系数全部在
AMI_Init里、根据通道冲激响应算好,AMI_GetWave只是套用这套固定系数。必须有真实冲激响应,无法用 delta 跳过。 - 波形自适应型模型:系数是在
AMI_GetWave里边处理波形边收敛的。这种才可以 delta-Init + 纯 GetWave。
AMI 文件里写着
1 | (CTLE_adapt (Usage In) (Type Integer) (List 0 1 2) (Default 2) ... "CTLE adaptation. (pulse based)")) |
即 CTLE/VGA/FFE/DFE 全部在 AMI_Init 阶段、基于冲激响应(pulse based)训练好系数;AMI_GetWave 只是套用这套已固定的系数去处理波形。所以一旦把真实冲激换成 delta,模型就以为"通道是理想直通的",自然不做任何均衡。
也就是说,真实的通道冲激响应是均衡质量的决定因素,无法省略 AMI_Init。我想要的无需 Init、纯 Get_Wave 均衡对它不成立。
尝试过的方法
为了解决上面的问题,我尝试过两个方法:
- 直接将 EOE 部分做线性近似,等效为一个二端口 S 参数,直接参与 Channelsim 链路的卷积。通过这个方法给 Rx AMI 喂冲激响应,自然能得到比较好的结果。但问题也很明显,EOE 不一定是线性或者可平滑可描述的,因为 MZM 的非线性,或者光纤色散(线性但冲激响应非局域)都会导致均衡结果不可靠。因此,这种方法也就在小信号近似、短光纤的情况下能用。
- 对 VPI 输出的波形信号做脉冲响应提取,再手动送入 Rx AMI init 计算均衡参数,最后 Get_Wave 得到均衡结果。此时就涉及到码型波形对齐与脉冲响应拟合收敛的问题。幸运的是这几年 AI 编程发展迅猛,在写代码这件事上给了我巨大助力。最终让我成功解决了 AMI 模型直接对波形均衡的问题。
综上,在 ADS 推出 System Designer 之前,我一直都采用的第二种办法——先用 ADS 与 VPI 进行联合波形仿真,再将波形导出用自制的 WaveformEye 软件进行手动均衡。
但现在,有了 System Designer for Ethernet 后,就可以将所有流程汇总在同一个平台里了。
系统链路
链路搭建
系统链路搭建如图
我先试一下仅有 EOE 的链路训练情况。这里的 EOE 光子链路和上一篇博客的相同,区别是我加了一堆 AMI 传递参数,还修改了 EOE 变量,让传递参数与外部参数保持一致。
例如 Tx 里控制预加重的
和 Rx 里控制链路训练的
公式评估
此外,根据 Rx AMI 输出的 SNR 和 SNR_MLSD,通过公式计算对应的 BER 和 BER_MLSD
由于 Get_Wave 的时候,每一个 block 都会计算一次 SNR。当比特序列不够多时,SNR 会有振荡,结果不准确,因此这里需要仿真足够多的比特数。我这里 ignore_bit 是 25000,只有这个数量之后计算出来的 SNR,才能求均值来作为我 AMI 整体给出的 SNR。
这里计算 BER 的 AEL 函数是
1 | defun snr2ber( snr, snr_marg, mode ) |
在数字通信里,BER 通常由符号之间的最小判决距离 与噪声标准差 决定。
对 PAM/QAM 系统,在高斯噪声下,误码概率近似为:
其中:
- ,是 Q 函数;
- 是调制相关的因子(例如 2 表示 BPSK,10 表示 PAM4);
- 是比例因子(考虑 Gray 编码映射后每个符号错误对应的平均比特错误数)。
这里其实就是:
利用 ,这个公式就是 Q 函数近似误码率公式的变体。
为什么对于PAM2(NRZ)而言,scale = 1/2,scale2 = 2 ?
证明:
首先从误差函数讲起,误差函数,表示满足中心极限定理前提下,随机事件归一化()后满足标准高斯分布,即基准值为0,偏离基准值误差在落在 到 之间的概率大小。与之相对的落在 到 之外的错误率表示为互补误差函数,,这一特性可以用在BER的计算上。
数学上定义Q函数(本质上就是高斯分布尾概率的积分形式,注意这是单边概率,在数字通信中经常用到)
Q函数与互补误差函数之间的关系
在高斯加性白噪声(AWGN)信道中,如果符号判决距离是 ,噪声标准差是 ,那么出错概率就是
所谓的符号判决距离 就是判决点处相邻 symbol 间的电压差。由于这个电压差会受到上 symbol 和下 symbol 噪声的影响,因此若偏离误差大于 ,即上/下 symbol 的判决电压落在了下/上 symbol 的判决范围内
我们知道判决距离的一半 就是信号电压幅值,则 ,AWGN 的正频功率(测量得到的单边谱) ,则
为什么对于PAM4而言,scale = 3/8,scale2 = 10 ?
证明:
相对于 NRZ,PAM4 信号的几个误码区间如下图所示
前面 NRZ 单比特出错概率是
同样的道理,PAM4(双比特)出错概率是
因为是格雷码,相邻level只有一个bit错误,相当于虽然双比特为一个 symbol 判断错误了,但其中真正错误的只有一个bit。因此 PAM4 的单比特出错概率只有双比特的一半(分子不变,分母×2)
又因为对于 PAM4 信号,存在两个振幅 和 ,则单比特能量为
则 PAM4 信号的误码率为
顺带介绍一下MLSD,最大似然序列检测,这是一种高级的DSP算法,指的是在所有可能的输入序列中,选择使得 假设的卷积响应和实际观测之间欧氏距离最小 的序列(MLSD把连续 L 个采样值看成一个 L 维向量,然后与所有可能发送序列产生的理想 L 维向量比较距离)。在 L=1 或 L=2 的情况下,SNR_MLSD 的最小欧氏距离退化成了眼高, L≥3 时,最小欧氏距离相当于"高维眼高",无法在眼图中看出。
传统眼图:
- 把信号折叠到 1UI 或 2UI 时间窗口内。
- 在主 cursor 的采样点上,统计上下轨迹的分布。
- 眼高 = 上分布最低点 − 下分布最高点。
对应的 SNR / BER:基于单点判决(逐符号 slicer),所以只能反映"一维采样"的性能。
MLSD (Maximum Likelihood Sequence Detection):
- 是一个 DSP 算法,一次性在 有限记忆长度(L taps) 的范围内判决整段符号序列。
- 它利用 ISI 的相关性,而不是把 ISI 当噪声。
SNR_MLSD:
-
定义为最小序列欧氏距离与噪声方差的比值:
-
其中 是所有可能序列对经过冲激响应后形成的波形之间的最小判决距离。
几何意义:它相当于一个 “高维的眼高” ——不是单点的电平间隙,而是整个 L UI 序列波形空间里的最小间隙。
仿真结果
链路均衡仿真结果如下
可以看出,AMI 链路训练第三批次的 SNR 结果收敛在 25 dB 左右。虽然 EOE 子链路左右都未连接 S 参数,但结果证明了 System Designer for Ethernet 做光电链路训练是可以行的。将仿真器日志等级设为 5,还能得到 AMI 更详细的输出训练参数
1 | RX(proxy_TX_FIR_m3 0)(proxy_TX_FIR_m2 0)(proxy_TX_FIR_m1 0)(proxy_TX_FIR_0 1)(proxy_TX_FIR_1 0)(CTLE_code 0)(VGA_code 11)(FFE_m3 -0.000448242)(FFE_m2 0.00950916)(FFE_m1 -0.039793)(FFE_0 0.915696)(FFE_1 0.27846)(FFE_2 0.00251901)(FFE_3 0.00438582)(FFE_4 -0.0123476)(FFE_5 0.000351778)(FFE_6 -0.00109195)(FFE_7 -0.00141609)(DFE_tap -0.0602676)(SNR 24.8931)(PAM4_Vm3 -0.155019)(PAM4_Vm1 -0.0535242)(PAM4_V1 0.0535242)(PAM4_V3 0.155019)(PAM4_Symbol 0.167)(PAM4_Sample 0.0421215)(PAM4_EHave 0.104735)(FFE_m4 0.000280882)(FFE_8 0.000327769)(FFE_9 -7.83867e-005)(FFE_10 -0.000804645)(FFE_11 6.31502e-005)(FFE_12 0.00240945)(FFE_13 0.00131104)(FFE_14 0)(FFE_15 0)(FFE_16 0)(FFE_17 0)(FFE_fb1_0 0)(FFE_fb1_1 0)(FFE_fb1_2 0)(FFE_fb2_0 0)(FFE_fb2_1 0)(FFE_fb2_2 0)(FFE_b1_loc 18)(FFE_b2_loc 21)(MLSD_alpha 0.19)(SNR_MLSD 24.8063))(PAM4_CenterThreshold 0)(PAM4_LowerThreshold -0.104272)(PAM4_UpperThreshold 0.104272) |
在 EOE 前后添加 S 参数
链路训练结果为












