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 NRZ | PRBS7 输入 | 眼图张开 |
| −3 dB 带宽 | ≥ 7 GHz | TT, 25 ℃, 1.0 V | AC 仿真 |
| 差分输出摆幅 | 400~800 mVpp | 100 Ω 差分负载 | 瞬态 |
| 差分阻抗 | 100 Ω ±10% | 小信号 | S11 < −10 dB |
| 总抖动 TJ | < 0.25 UI | BER=1e-12 | 眼图/浴盆曲线 |
| 功耗 | < 5 pJ/bit | TT, 1.0 V | 平均电流 |
这张表的意义在于:它把"高速"这个模糊形容词变成了可仿真的数字。后面每一次 ADE 仿真,都是在验证其中一行或几行。
1.2 Virtuoso 设计环境的组成与配置
Virtuoso 不是一个单一程序,而是一组协同工具。理解它们的分工,比记住菜单位置更重要。下图给出本节最需要看清的工具关系与数据流:从库与工艺数据出发,经原理图/版图编辑,到仿真与结果分析,形成一条闭环。
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Ω 之外的量纲。