1. 课程导入与设计环境搭建

高速模拟接口电路处在芯片与外部世界的边界上,它要处理的是速率、幅度、阻抗、噪声与功耗之间的多重折中。典型对象包括 SerDes 收发前端、差分驱动器与接收机、时钟与数据恢复(CDR)中的模拟环路、高速 ADC/DAC 的输入输出缓冲、以及片间互连的均衡器。与纯数字电路不同,这些电路的性能往往由几个连续量决定:带宽、增益、相位裕度、输出摆幅、共模电平、抖动、回波损耗。设计目标不是"功能正确"就结束,而是要在工艺角、温度、电源电压波动下同时满足一组互相牵制的指标。

因此,本课程的第一件事不是立刻画原理图,而是把"要做什么、做到什么程度、在什么条件下算通过"讲清楚,再把 Cadence Virtuoso 这套设计环境配置成能承载这些目标的工作台。下面先建立指标意识,再落到工程目录与工具配置。

1.1 从应用场景反推设计指标

高速模拟接口的指标不是凭空设定的,而是由链路预算倒推。以一条 10 Gb/s 差分串行链路为例:发送端驱动器需要提供足够的输出摆幅,使信号经过信道衰减后仍能被接收端可靠判决。假设信道在 Nyquist 频率 5 GHz 处插入损耗约 12 dB,接收机灵敏度要求差分 100 mVpp,那么发送端在考虑均衡增益后至少要输出 400 mVpp 以上,并留出 3~6 dB 余量。这个简单估算直接决定了驱动器的输出摆幅、线性度和功耗预算。

常见的指标维度可以归纳为以下几类,它们彼此耦合,改动一个往往牵动其余:

  • 速度类:数据速率、−3 dB 带宽、压摆率、建立时间。带宽通常要求不低于数据速率的 0.6~0.7 倍(NRZ 经验值)。
  • 幅度与线性类:输出摆幅、增益、THD、1 dB 压缩点、共模电平范围。
  • 阻抗与匹配类:差分/单端阻抗(常见 100 Ω 差分、50 Ω 单端)、回波损耗 S11、端接方式。
  • 噪声与抖动类:输入参考噪声、随机抖动 RJ、确定性抖动 DJ、总抖动 TJ 与误码率目标(如 1e-12)。
  • 鲁棒性类:PVT 角(SS/TT/FF、−40~125 ℃、±10% 电源)、电源抑制比 PSRR、共模抑制比 CMRR。
  • 功耗与面积类:静态电流、每 Gb/s 功耗(pJ/bit)、版图面积。

把这些指标写成一份可执行的"设计目标表",是后续所有仿真的判据来源。示例(数值为教学假设,非实测):

指标目标值测试条件判据
数据速率10 Gb/s NRZPRBS7 输入眼图张开
−3 dB 带宽≥ 7 GHzTT, 25 ℃, 1.0 VAC 仿真
差分输出摆幅400~800 mVpp100 Ω 差分负载瞬态
差分阻抗100 Ω ±10%小信号S11 < −10 dB
总抖动 TJ< 0.25 UIBER=1e-12眼图/浴盆曲线
功耗< 5 pJ/bitTT, 1.0 V平均电流

这张表的意义在于:它把"高速"这个模糊形容词变成了可仿真的数字。后面每一次 ADE 仿真,都是在验证其中一行或几行。

1.2 Virtuoso 设计环境的组成与配置

Virtuoso 不是一个单一程序,而是一组协同工具。理解它们的分工,比记住菜单位置更重要。下图给出本节最需要看清的工具关系与数据流:从库与工艺数据出发,经原理图/版图编辑,到仿真与结果分析,形成一条闭环。

Virtuoso 高速模拟接口设计环境:工具分工与数据流 CIW 命令窗口 启动入口 / 日志 SKILL 脚本执行 Library Manager 库 / Cell / View 工艺库与自建库 工程目录 cds.lib / .cdsinit sim / 结果归档 Schematic Editor 原理图 / 符号 测试台 Testbench Layout Editor 版图 / 寄生提取 PEX 后仿 ADE L / XL / Assembler L:单点仿真 XL:参数扫描 / 优化 仿真引擎与结果 Spectre / APS / AMS 波形 / 眼图 / 浴盆曲线 结果反馈:调参 / 改拓扑 / 重跑角 闭环要点:指标表 → 测试台 → 仿真 → 结果判读 → 修改设计,任一环节缺失都会让"高速"失去可验证性。 CIW 与 cds.lib 决定"能不能打开",Library Manager 决定"打开什么",ADE 决定"验证到什么程度"。

CIW(Command Interpreter Window)是 Virtuoso 的启动窗口,也是所有日志与 SKILL 命令的落点。工程启动时,它会读取工作目录下的 cds.lib 与 .cdsinit。前者定义库的搜索路径,后者定义环境变量、快捷键与默认仿真器。一个常见问题是:明明工艺库已安装,Library Manager 里却看不到,多半是 cds.lib 中缺少 DEFINE 行,或路径写成了相对路径而启动目录不对。

# cds.lib 示例(教学用,路径按实际安装调整)
DEFINE gpdk180   /PDK/gpdk180/techfile
DEFINE analogLib $CDSHOME/tools/dfII/samples/artist/analogLib
DEFINE my_serdes ./design/my_serdes
INCLUDE ./cds.lib.local

其中 analogLib 提供 vdc、vpulse、idc、res、cap 等基础元件,是搭建测试台的最小集合;my_serdes 是自建设计库,用于存放本次课程的 cell。建议把工艺库与自建库分开,工艺库只读,自建库可写,避免误改 PDK。

1.3 工程目录与库结构规划

高速接口项目往往要跑几十个仿真角、保存大量波形,目录规划不当会让结果难以追溯。推荐按"库—cell—view—仿真"四层组织,并让仿真目录与设计目录分离:

project_root/
├── cds.lib              # 库定义
├── .cdsinit             # 环境初始化
├── design/
│   └── my_serdes/       # 自建设计库
│       ├── drv_core/    # 驱动器核心
│       │   ├── schematic
│       │   ├── symbol
│       │   └── layout
│       └── tb_drv/      # 测试台 cell
└── sim/
    └── drv_core/
        ├── dc_op/       # 静态工作点
        ├── ac_bw/       # 带宽
        ├── tran_eye/    # 眼图
        └── corners/     # PVT 角

这样组织的好处是:每个仿真任务有独立目录,ADE 保存的 state 与结果互不覆盖;当需要复现某个结论时,直接进入对应目录即可。命名建议带条件后缀,例如 tran_eye_tt_25c_1v0,避免"final_v2_really"这类无法追溯的名字。

1.4 ADE L / XL / Assembler 的分工与首次配置

ADE 家族三个工具面向不同复杂度。ADE L 用于单点仿真:设定一个工艺角、一个温度、一个电源电压,跑一次 AC 或 tran,看波形是否满足指标。它是理解电路行为的主力。ADE XL 在此基础上支持参数扫描、蒙特卡洛与优化,适合回答"输出摆幅随负载电阻如何变化""失调电压的 3σ 是多少"。ADE Assembler 面向多测试台、多角并行的系统级验证,例如同时跑 TT/SS/FF 三个角、三个温度、两个电源电压,共 18 种组合,并汇总通过/失败。

首次配置的关键动作是:在 CIW 中确认仿真器路径,在 ADE 中设置默认模型库与仿真器选项。以 Spectre 为例,需要在 ADE 的 Setup → Model Libraries 中加载工艺模型文件,并指定 section(如 tt、ss、ff)。若使用 APS 加速,可在 Simulation → Options 中启用多线程。一个可参考的初始设置如下:

; .cdsinit 片段(教学示例)
envSetVal("spectre.envOpts" "modelFiles" 'string "/PDK/gpdk180/models/spectre/models.scs")
envSetVal("spectre.envOpts" "simulator"  'string "spectre")
envSetVal("spectre.envOpts" "numThreads" 'int 4)
hiSetBindKey("Schematics" "<Key>F3" "hiZoomAbsolute()")

配置完成后,建议用一个最小测试台做"环境自检":一个理想电压源驱动 1 kΩ 电阻,跑 DC 工作点,确认电流为 1 mA(1 V / 1 kΩ)。这个结果虽然简单,却能一次性验证模型库加载、仿真器调用、结果读取三条链路是否通畅。若电流明显偏离,优先检查模型 section 是否选错、单位是否被误设为 mA 或 kΩ 之外的量纲。

环境自检通过后,再开始搭建真实的驱动器测试台。很多"仿真不收敛""结果全为零"的问题,根源都在模型库未正确加载或 cds.lib 路径错误,而不是电路本身。