Channelsim 调用 VPI 案例联仿

前言

在 Ethernet Designer 出来以前,我是用的 Channelsim 调用 VPI 做联仿的,因为 VPI 中有很多现成的案例可供参考。

虽然 VPI 也是一个很强大的光通信仿真工具,用来做学术研究,理论模型很不错,但工程能力相比 ADS 就逊色很多了。例如你想在其中使用 S 参数,由于没有现成的 S 参数工具,就只能摆出一堆滤波器来实现,密密麻麻的很是恼人,参考我以前写的博客VPI中加载光s4p参数

趁这次机会,我将以前做 ADS-VPI 联仿的经验总结一下,也算是给未来可能淘汰掉的工程方法做个收尾。

VPI 案例分析

这次用最简单的 VPI 案例为单波 100G PAM-4 光互连(Single-Wavelength 100G PAM-4 Optical Interconnect),原理图如下

VPI Demo

先简要分析一下这个简单案例。信源是一个 PAM-M 的电信源,该信号经过滤波与整形处理后,以差分的形式喂给推挽式 MZM 的电极,调整两臂相位实现光载波调制。光信号经过光纤后,由一个 PD 的行为模型接收,转换为电信号,再经过这个 PD 的等效低通滤波,也就是 S21,传给 CDR 与 FFE 做处理,最后计算出 BER 与 SER。

这里需要注意的是,VPI 这里的 CDR 是一个理想的,可以认为是作弊了的时钟恢复组件 ClockRecoveryIdeal。因为该组件是根据逻辑通道的信息,也就是 PAM-M 信源输出的比特流来做相关运算,从而对齐信号与码型。因此这里跟传统的 DSP 芯片通过 PLL 恢复时钟信号不一样,理论上 Rx 端在设置好各种均衡参数后就不需要 Tx 端的码流信息了。同样的道理,BER_Multilevel 也是为了计算蒙特卡洛的 BER 而获取了逻辑通道中的码流信息。

我们想把 VPI 中的光电链路案例嵌入到 ADS ChannelSim 中,通过通道仿真的方式进行链路级评估。这里需要注意几个问题:

  1. VPI 案例中的电信源是自带的,需要替换为 ADS 中的 AMI 模型。
    VPI 本身主要负责光电器件与光链路行为仿真,并不直接承担 ADS ChannelSim 所需的 AMI 模型加载与训练流程。因此,Tx / Rx 的 AMI 行为仍然需要在 ADS 侧完成。
  2. 逻辑通道中的码流信息也需要一并考虑。
    Rx AMI 的均衡参数不是单纯从接收波形中“凭空”得到的,而是依赖已知码型、接收波形以及目标判决电平之间的关系进行估计。因此,仿真中不仅要传递波形,也要保证 Tx 端发出的 symbol pattern 与 Rx AMI 端用于训练的码型一致。
  3. 嵌入后的链路训练方式需要重新考虑。
    对 ADS 而言,VPI 嵌入组件更像是一个波形变换黑箱。ChannelSim 可以看到它的输入输出波形,但未必能够像处理普通 S 参数通道那样,直接得到经过 VPI 光电链路之后的 pulse response。因此,如果 Rx AMI 的训练依赖 pulse response,或者需要基于通道脉冲响应来计算均衡参数,就可能遇到困难。
  4. 完整链路训练需要 Tx AMI 与 Rx AMI 协同。
    在标准电链路 AMI 流程中,Rx 端可能通过训练得到类似 proxy_TX_FIR 的反馈参数,再传递给 Tx,用于调整 Tx FFE / FIR 预加重系数。
    但当中间链路被 VPI 嵌入组件替代后,这种 Tx-Rx 之间的反向协同训练链路不一定还能自然打通。因此,实际建模时需要明确:VPI 组件到底只是一个固定的 E-O-E 波形映射,还是也参与 AMI 训练闭环。

因此,把 VPI 光电链路嵌入 ADS ChannelSim 时,不能简单把它理解成一个普通的 S 参数通道。它更接近一个 E-O-E 行为黑箱:输入是电信号波形,输出也是电信号波形,中间包含光源、调制器、光纤、探测器和模拟前端等复杂行为。

这会带来一个关键问题:传统 AMI 链路训练往往依赖码型、pulse response 以及 Tx/Rx 之间的参数协商;而 VPI 嵌入链路未必能自然暴露这些信息。因此,真正可行的方案通常有两类:

  • 一类是把 VPI 链路当作固定黑箱,只做波形级前向仿真,然后在 Rx 端做后处理均衡;
  • 另一类是将 VPI 链路等效成 ADS / AMI 能识别的行为模型,例如线性 impulse response、Volterra 模型、查表模型或自定义 Redriver AMI,从而重新接入 ChannelSim 的训练闭环。

第二类方法也就是 Ansys Interconnect 最新出来的电光电 AMI 构建法。利用机器学习,逆向拟合出 E-O-E 黑箱 Volterra 模型的各阶级数,构建一个 AMI 中继器,在 AEDT 里进行系统仿真。

VPI 案例嵌入

复制控件

从前面的 VPI 原理图中,我们可以看出,所需的主体部分主要是调制与光纤部分。因此我们仅需提取该部分到 Template 里

ADS-VPI模板

迁移参数

仅仅只是复制控件还不够,还需要将全局参数一并拷贝过来

将全局参数也都拷贝过来

在 Template 中加载这些参数

加载参数

记得检查各个控件自带的 data 文件,保证全都迁移过来了,例如光纤参数 attFile_SMF.dat 和 dispFile_SMF.dat 文件

调整输出

由于 VPI 案例中 Rx 信号没有 TIA,且没有 block DC。因此这里需要稍加修改,顺带将原理图中的几个 SignalAnalyzer 给禁用掉。

添加 BlockDC

去除信号 DC

添加 TIA

添加 TIA

最终 VPI 嵌入链路如下

最终 VPI 嵌入链路

检查链路

之所以要检查链路,是为了确保该链路自身能够正常运行,输入输出信号是合理的。因此需要将 ADS Dynamic InputADS Dynamic Output 先 Exclude 掉,换成原电信源与示波器

检查链路

此外,还需要关闭 Run 里的脚本

取消脚本运行

运行查看结果(将前面禁用掉的 Analyzer 重新 active)

检查运行结果没问题

运行结果没啥问题,就可以将 Analyzer 重新禁用掉了。将 ADS Dynamic InputADS Dynamic Output 重新连接回来,并在 Run 里打勾,回到最终 VPI 嵌入链路。

参数传递

所谓的参数传递,指的是 ADS 中 VOL 控件中可以修改并传递给 VPI 的参数,这需要在 VPI 链路中添加。

假如我们想传递光纤长度这个参数,可以将 FiberLength 移至 ADS (VOL parameter) 栏目里

移动传递参数

这里我还额外添加了一个波长的参数

定义传递参数

关闭 VPI 原理图,回到 ADS 中重新 Apply 一下 VOL 控件,可以看到传递参数都正确显示并可在 ADS 中进行修改了

VOL控件中显示可传递参数

ADS 链路输出

回到 ADS,搭建完整系统链路(这里加的 Tx 和 Rx 的 S 参数代表封装损耗)

完整系统链路

TX AMI 这里使用已知的码型,以供后面 Tx Wav AMI 恢复

设定Tx的码型

RX 这里使用了 FlexDCA Probe,目的是查看并导出波形文件

FlexDCA_Probe 设置

运行链路仿真(如果在 ADS Dynamic InputADS Dynamic Output 中打开了 ShowData,还能看到 VPI 链路进出的眼图)

VPI链路进出眼图

ADS 眼图恢复

查看 Eys_Probe 的眼图,可以发现眼图早已闭合,我们接下来要做的就是使用 DSP 芯片的 AMI 模型将眼图恢复出来。

新建一个原理图,参考上一篇博文——从波形恢复眼图,我们要对波形做均衡来恢复眼图。

从波形恢复眼图

这里需要注意的是,运行前我们要对 VPI_Waveform.csv 稍做处理,去除数据头,避免 Tx Wav AMI 读取错误

删除波形数据头

运行眼图恢复链路

各节点眼图

总结

这篇文章详细讲述了如何在 ADS Channelsim 中调用 VPI 案例进行联仿,总共分三步:

  1. 嵌入 VPI 链路
  2. ADS 链路波形仿真与导出
  3. 波形眼图恢复

虽然最后算是成功恢复出来了眼图,但考虑到 Rx 端的链路训练未能协同到 Tx 端,链路训练的恢复能力有限。

相较于 Ethernet Designer 中的 Photonics EOE 模式,当前通道仿真用的是 bit-by-bit 模式,也只有 bit-by-bit 模式能够调用 VPI 链路。

我之所以仍在使用 ADS-VPI 联仿,是因为我总感觉 Ethernet Designer 里的 fiber 控件有问题,关于色散的计算不太对,这点我以后会持续关注。