刚接触模拟电路设计的时候,很多人第一个想动手试试的电路就是 buffer。原因很简单:概念清楚、结构不复杂、搭完能看到实实在在的波形变化,特别适合用来熟悉 EDA 工具的整体流程。这篇文章就围绕“用 Cadence 搭建 buffer 电路并完成仿真”这件事,把从原理图到仿真结果的全过程拆开讲清楚。内容以 Virtuoso 环境为主,版本差异不影响整体思路,新手可以照着走一遍,有点基础的人也能在细节里找到一些平时容易忽略的点。
1. 内容整体设计与思路拆解
1.1 为什么选 Cadence 来搭 buffer 电路
Cadence 的 Virtuoso 是模拟/混合信号电路设计里最主流的平台之一,无论是学校里的课程项目,还是流片前的全定制设计,几乎都绕不开它。选它来练手 buffer,除了工具本身覆盖面广,更重要的原因是:Virtuoso 的“原理图编辑—仿真—波形查看”闭环非常成熟,能让你把注意力放在电路本身,而不是花大量时间跟脚本和配置文件搏斗。
Buffer 电路,也叫电压跟随器或单位增益放大器,最常见的实现就是用单个运算放大器接成负反馈:输出直接连回反相输入端。它的特点是输入阻抗极高、输出阻抗极低,电压增益约等于 1。换句话说,它不放大信号幅度,但能把“带不动的信号”变成“带得动的信号”,起到隔离和驱动的作用。
在 Cadence 里搭 buffer,你会接触到几个核心组件:原理图编辑器(Schematic Editor)、模拟设计环境(ADE L 或 ADE XL)、波形窗口(Waveform Window)。这三个东西贯穿整个模拟电路设计流程,把它们用熟了,后面做放大器、滤波器、锁相环都是同一套打法。
1.2 方案选型:用理想 opamp 还是晶体管级
新手第一次练习,我强烈建议先用 analogLib 库里的理想运算放大器 ipamp 或者 eopamp。原因很直接:ideality opamp 不需要设置晶体管参数,没有工作点、宽长比、偏置电流这些概念,接上电源和信号就能仿真。这样一来,你只需要关注 buffer 这个拓扑本身的行为,不会被器件的细节干扰。
等你把 buffer 的行为摸清楚了,再考虑用 CMOS 晶体管搭一个真正的单级或者两级运放来做 buffer,那时候你面对的就是另一套复杂度:输入对管的尺寸、尾电流源、输出摆幅、相位裕度……这些内容适合作为第二个进阶项目,不建议一上来就挑战。
另外还有一个小细节要提前说清楚:Cadence 里自带的理想运放库,不同版本里模型名称有细微差别。通常 analogLib 里可以直接找到 opamp 或者 ipamp,我在 IC 617 和 IC 618 里都用过,基本都能直接调出来。如果你的库里面名字不太一样,搜索 “opamp” 基本能定位到。
2. 核心细节解析与实操要点
2.1 建库、建单元,别在根目录下直接画原理图
很多人第一次打开 Virtuoso,顺手就在默认的目录下面新建了一个 schematic,结果画了几笔发现库管理混乱,保存路径不对,后面仿真根本跑不起来。标准的做法是先建一个自己的库,再在库里面建 cell,最后打开 cell 的 schematic 视图开始画图。
在 Library Manager 里操作,Create -> New Library,会弹出一个对话框。这里有几个关键选项:
- Library Name:给自己的库起个名字,比如 analog_practice
- Directory:库文件的存放路径,建议放到自己有读写权限的目录下,不要放在安装目录里
- Attach to Technology Library:选一个工艺库绑定。如果你只是做功能仿真,可以选 “Don't need a techfile” 或者绑定通用的 analogLib
这里有个容易踩的坑:如果你后续要用真实的工艺库(比如 tsmc18、smic18 之类)做仿真,建库时一定要选对对应的 techfile,不然后面调用工艺库里的晶体管会报错。如果只是练手 buffer,用通用库完全没问题。
建好库之后,Create -> Cellview -> New View,Cell Name 填 buffer_test,Type 选 schematic,打开原理图编辑器。
2.2 从 analogLib 调元件,布局有讲究
进入原理图编辑器后,用快捷键 I(Instance)打开元件添加窗口,Library 选 analogLib,Cell 那一栏搜索你需要的器件。最常用的几个:
- gnd:接地符号
- vdd:电源符号(也可以直接用 vdc 电源)
- ipamp:理想运放
- port 或者 pin:输入输出端口
- vdc:直流电压源(用来给运放供电和提供输入信号)
- vsin 或者 vpulse:交流信号源,用来做瞬态仿真
布局方面我个人的习惯是:电源在上、地在下、输入在左、输出在右。运放放中间偏左一点,给反馈连线留出空间。这样画出来的图不仅自己看着舒服,后面截图写报告也好看。
连线用快捷键 W(Wire)。要注意的是,buffer 的反馈线是从输出端直接拉到反相输入端的,也就是运放的负端。如果你拉错线拉到了正端,那这个电路就变成了正反馈比较器,输出会直接顶到电源轨,根本不是 buffer 的行为。这个错误非常典型,新手几乎都会犯一次。
2.3 电源和信号的设置方法
在原理图里放好元件只是第一步,最关键的是给每个电源和信号源设置参数。双击每个器件实例,会弹出属性设置窗口。
vdc 电源(给运放供电的)需要设置 DC voltage 参数。比如你打算用正负 2.5V 供电,那就放两个 vdc:一个设置 2.5V 接在 VDD 端,一个设置 -2.5V 接在 VSS 端。接地端统一用 gnd 符号。
输入信号这里分两种情况:
- 如果做 DC 扫描,想看 buffer 的输入输出传输特性曲线,输入信号用一个 vdc,设置一个初始电压比如 0V,然后在仿真环境里扫描它的值。
- 如果做瞬态仿真,想看 buffer 对正弦信号或者方波的跟随效果,输入信号用 vsin,设置振幅和频率。比如振幅 1V、频率 1kHz 的正弦波,输入输出应该完美重合(或者只有极小的延迟)。
还有一个关键设置:运放电源引脚。analogLib 里的 ipamp 通常有 V+ 和 V- 两个电源输入引脚,需要手动连到你的 vdc 上。如果你用的是某些只有一个电源的模型,也要注意看它的供电范围。很多人忘了给运放供电,仿真出来的波形完全不对,就是这个原因。
提示:在给运放接电源之前,先用鼠标点击运放器件,按 Q 查看属性,确认引脚名称和数量。不同模型版本引脚标注有差异,确认好再连线,能省去后面排查问题的很多时间。
3. 实操过程与核心环节实现
3.1 完整搭建一个基于理想运放的 buffer
下面按步骤走一遍完整的搭建过程,以 Cadence Virtuoso IC618 为例,但操作逻辑适用于大多数版本。
第一步,打开 Library Manager,新建库 bjt_amplifier_lib(名字可以自己取),绑定 generic 工艺或者不绑定。然后新建 cell Buffer_Test,打开 schematic 视图。
第二步,在原理图编辑器里按 I,在 analogLib 里找到 ipamp,放置一个到画布中央。接着放置两个 vdc 作为供电电源,一个 gnd 作为系统地。为了方便后续设置信号,再放置一个 vsin 作为输入信号源。
第三步,连线。ipamp 的 V+ 接正电源 vdc 的正极,V- 接负电源 vdc 的负极(或者地)。输入信号 vsin 的正端接 ipamp 的正相输入端,负端接地。输出端接一个 pin(标识为 VOUT),然后从输出端拉一根反馈线接到 ipamp 的反相输入端。
注意:为了让输出端有明确的标识,建议添加 pin。在原理图编辑器里按快捷键 P,添加 pin 并命名 VIN 和 VOUT,这样可以更清楚地看到输入输出关系。
第四步,设置参数。双击每个 vdc,把正电源设置为 2.5V,负电源设置为 -2.5V。双击 vsin,把振幅设为 1V,频率设为 1kHz。双击 ipamp,检查模型参数,一般保持默认即可。
第五步,检查连接。按 X 可以下钻到选中的器件内部,按 Shift+F 回到上层。最常用的检查方式是直接看连线是否高亮,以及用 Design Checks 功能(Launch -> Run Checks)做一下 ERC 检查,确保没有悬空引脚。
到这里,原理图部分就完成了。下一步进入仿真阶段。
3.2 ADE L 仿真环境设置与瞬态仿真操作
在原理图编辑器中,选择 Launch -> ADE L,打开模拟设计环境。如果你用的是 IC618 之后的版本,Launch 里可能默认是 ADE Explorer,操作逻辑类似。
进入 ADE L 之后,需要设置仿真类型、分析类型和输出信号。我建议先跑一个瞬态仿真,看看 buffer 对正弦信号的跟随效果。
在 ADE L 界面的 Analysis 菜单里选择 tran(瞬态分析)。设置如下参数:
- Stop Time:5ms(如果是 1kHz 信号,5ms 就是 5 个周期,足够观察波形)
- Accuracy Defaults:保持默认(或者选 moderate)
然后设置输出。在 Outputs 菜单里选择 To Be Plotted,接着在原理图上点击 Vs 正端和输出端 Vout 的连线,把它们标记为要打印的节点。这样仿真结束后会自动弹出波形窗口,绘制这两个节点的电压曲线。
设置完点击绿色播放按钮运行仿真。正常情况下,你会看到波形窗口里两条曲线基本重合:输入正弦波和输出正弦波幅度一致、相位一致。如果出现幅度偏小、输出变形或者根本没波形,就要检查前面提到的几个问题:供电是否正确、反馈是否接在负端、信号源参数是否设对。
如果波形正确,恭喜你,第一个 Cadence buffer 电路已经跑通了。
3.3 DC 扫描与增益曲线的深入验证
瞬态仿真只能看到 buffer “跟随”信号的现象,但不能精确判断电压增益是否为 1。要定量验证增益,还需要做一个 DC 扫描。
在 ADE L 的 Analyses 里,点击 dc,然后设置 Design Variable。这里需要在原理图中把输入信号源 vsin 改成 vdc,并把它的 DC voltage 设置为变量,比如 vinput。具体做法是:双击输入信号源,在 DC voltage 一栏填 vinput,ADEL 里会自动把它识别为设计变量。
DC 扫描的设置如下:
- Design Variable:vinput
- Sweep Range:Start -2.4V,Stop 2.4V,Step 0.01V(或者用线性扫描 1000 个点)
输出设置为 Vout 节点的电压,运行仿真。你会看到一条斜率为 1 的直线:输入从 -2.4V 扫到 2.4V,输出几乎完全跟随。从这条直线可以算出斜率,也就是电压增益,约等于 1。这就是 buffer 的传输特性。
需要注意的一点是,理想运放模型下这条直线会在很宽的范围内保持完美线性。如果用真实晶体管搭 buffer,由于输出摆幅受电源轨限制,直线两端会像被削平一样弯曲,那就是输出摆幅极限。这也是理想模型和真实电路之间最直观的差距之一。
3.4 交流小信号分析看带宽特性
Buffer 并不是在所有频率下增益都等于 1。由于运放本身的带宽限制,高频时增益会下降,甚至出现相位滞后。这个问题用 AC 分析可以看得非常清楚。
在 ADE L 里添加一个 ac 分析,同时给输入源增加 AC 幅度。双击输入源 vdc,在 AC magnitude 一栏填入 1,AC phase 保持 0。这样仿真器就知道用这个源作为交流小信号激励。
AC 扫描参数设置如下:
- Sweep Type:Logarithmic
- Start Frequency:1Hz
- Stop Frequency:100MHz
- Points per Decade:20
输出设置改为 Vout 的电压幅度和相位(可以同时打印幅度曲线和相位曲线)。运行仿真后,增益曲线会显示一条从 0dB 开始的高电平平台,在高频处逐渐下降,-3dB 点就是 buffer 的闭环带宽。
对于理想 opamp 模型,带宽可能非常高甚至不显示下降;如果使用更真实的宏模型,就能看到典型的单极点响应。这一步骤帮助你理解 buffer 的带宽限制,也是以后设计高速缓冲器时的重要参考。
3.5 使用真实 CMOS 工艺库搭建晶体管级 buffer
如果你手头有 PDK 工艺库,就可以从理想运放升级到真正的晶体管级 buffer。用 CMOS 实现 buffer 的常见结构有两种:
- 简单单位增益缓冲器(source follower):一个 NMOS 或 PMOS 接成共漏极结构,输出从源极引出。这是最简单、最基础的 buffer,缺点是增益略小于 1,且输出摆幅有限。
- 两级运放接成单位增益负反馈:例如经典的 Miller 两级运放(差分输入 + 共源输出级),输出端直接接回反相输入端。这是更接近实际应用的 buffer 结构,增益精度高,输出能力强。
在 Cadence 中,从 PDK 库里调入 nmos4、pmos4 等晶体管。PDK 库通常出现在 Library Manager 中,例如 tsMC18rf 或 gpdk180。搭建时给晶体管设置统一的宽长比,例如 NMOS W=2u L=500n,PMOS W=2u L=500n,并用 vdc 提供合适的偏置电压。
这里需要额外注意的是晶体管的衬底连接。绝大多数 CMOS 工艺中,PMOS 的衬底要接最高电位(VDD),NMOS 的衬底要接最低电位(VSS)。如果衬底没有正确连接,仿真会报错,或者结果完全不对。这是从理想模型切换到晶体管模型时最常出现的错误。
搭好带偏置电路的晶体管级 buffer 后,按照与之前相同的流程设置 ADE L,先做 DC 工作点分析(OP Analysis),检查每个晶体管是否工作在饱和区。然后跑 DC 扫描和瞬态仿真,验证 buffer 行为。
4. 常见问题与排查技巧实录
4.1 波形只有一条线或者输出为 0
这是我见过最多的新手问题。当你运行瞬态仿真,发现波形窗口里只有输入信号那一条线,输出一直是 0V 或者一条直线,大概率是以下几类原因:
- 运放没有供电:检查 V+ 和 V- 是否确实连到了 vdc 电源上。有时候连线看似连上了,但实际上只连到了电源符号的引脚边缘,中间断了一小段,要用放大镜(快捷键 Z)拉近检查。
- 反馈没接对:确认输出端的那根线是否确实接到了运放的负相输入端。你可以在原理图中点击那根线,它会高亮显示,顺着高亮线看到底连到了哪里。我曾经见过有人把反馈线连到了同相输入端,结果仿真出来输出直接顶到电源轨,完全看不到正常的波形。
- 瞬态分析时间太短:如果 stop time 设置得过短,信号还没来得及变化就结束了。建议先让仿真跑完 5~10 个信号周期,再观察波形。
排查时最有效的方式是按一下 ADE L 里的 Calculator,点击“plot”按钮,再在原理图里点击你要观察的net。这样能快速查看任意节点的电压波形。
4.2 输出电压比输入低(增益小于 1)
如果输入 1V 正弦波,输出只有 0.95V 左右,这通常说明你用的不是理想运放,而是真实晶体管组成的源极跟随器。源极跟随器的电压增益天然略小于 1,因为存在体效应和有限的输出电阻。这是正常现象,不是 bug。
但如果你用的是理想运放 ipamp,输出还偏小,就要检查是不是负反馈没有完全闭合,或者运放的输出摆幅限制了你设置的信号幅度。例如正负 2.5V 供电下,理想运放输出不可能超过 2.5V,也不一定能到 2.5V,具体看内部输出级结构。
解决方式是减小输入信号幅度或提高电源电压。
4.3 DC 扫描时输出电压不平滑
DC 扫描的传输曲线如果出现突变或跳变,多数原因是运放模型内部存在非线性行为,或者反馈连接存在错误(例如正反馈)。使用理想运放时通常不会出现跳跃。
如果是真实晶体管电路,DC 曲线在小电压范围时可能出现交越失真或非线性区域,这取决于你选的运放结构。例如简单的 class A 输出级通常线性度还可以,但 push-pull 输出级容易出现交越失真。
4.4 仿真报错 “Unknown instance” 或 “Unable to open library”
这类问题几乎都是库引用错误。检查你创建的 cell 是否绑定了正确的工艺库,以及你调用的元件是否真的存在于当前库中。AnalogLib 是 Cadence 自带的通用库,但如果你的库没有 attach 到某个 techfile,调用模拟库中的某些器件时也会奇奇怪怪地报错。
解决方法是重新创建库,并在创建过程中正确选择 techfile。
4.5 一个让仿真加速两倍的小技巧
如果仿真速度太慢,可以在 ADE L 的 Simulation Options 里开启 spectre 的 fast 模式,或者减少瞬态仿真的精度等级。对练手级的 buffer 电路,精度选 moderate 就足够了。另外,瞬态仿真的最大步长不要设得太小,否则会极大拖慢速度。信号频率是 1kHz 时,最大步长设为 10us 完全足够,没必要设置成 1ns。
5. 从 buffer 出发还能做些什么
5.1 把 buffer 串成链驱动大电容负载
Buffer 最常见的用途之一就是驱动大电容负载。在芯片内部,一些模块需要驱动很长的金属连线或者较大的栅极电容,这时单级 buffer 往往不够,需要多级 buffer 串联,逐级加大驱动能力。
在 Cadence 里做这个实验很简单:把几个 buffer 连在一起,最后挂一个 10pF 的电容负载,然后在输入加一个方波,观察输出波形的上升沿和下降沿。你会发现级数越多、最后一级驱动能力越强,上升沿就越陡。这就是数字电路里“buffer chain”的雏形。
5.2 用 buffer 做电平移位和隔离
在混合信号电路里,前级传感器输出信号很微弱,后级 ADC 输入阻抗又比较低,直接连接会把信号拉垮。中间加一个 buffer,利用它高输入阻抗的特性把传感器和后级隔离开,这就是所谓的隔离作用。
动手实验时,你可以在 buffer 前面串联一个 1MΩ 电阻,再在后级挂一个 1kΩ 负载,对比有无 buffer 时负载上的信号幅度。你会发现,没有 buffer 时信号被分压得所剩无几,有了 buffer 后信号几乎无损地传递到负载,这个直观的对比会让你彻底理解 input impedance 和 output impedance 的含义。
5.3 Buffer 与时钟缓冲、数据缓冲的关系
如果我们把视角从模拟电路移到数字和接口领域,Cadence 同样能用来做数字 buffer 的仿真。比如 clock buffer、data buffer 的延时和驱动能力分析,在 Virtuoso 里也能用类似的方法搭环境。搜索热词里出现过 pingpong buffer、camera 多媒体 buffer 管理,这些更多是系统架构层面的概念,与电路级的电压跟随器不同,但思想上有相通之处:通过中间缓存/缓冲来隔离上下游、匹配速率。作为电路设计者,先把模拟 buffer 的电路行为吃透,再去接触系统级的 buffer 管理,有百利而无一害。
6. 我的实操心得与补充建议
用 Cadence 搭 buffer,难度不在电路本身,而在整个工具链的熟悉程度。我见过很多人第一天学 Virtuoso,被原理图编辑器、ADE 环境、波形窗口这些界面搞得头大,画一个 buffer 花了两个小时,最后还没仿真出来。说白了,EDA 工具的学习只有一个办法:多练。等你把操作练熟了,从打开软件到跑出第一个 buffer 波形,五分钟内完全能搞定。
几个实实在在的建议给到新手:
- 原理图保持整洁。电源线用两种颜色或者统一走线方向,输入输出明确分开。这看起来只是美观问题,但在复杂电路里,整洁的布局能大幅降低你排查错误的难度。
- 每次改动电路之后,先跑一遍 ERC 或者只跑 DC 工作点,再跑复杂的瞬态仿真。别一上来直接跑 tran,那样问题多了根本分不清是哪一步除了差错。
- 善用 state 保存。ADE L 里的 Session -> Save State 可以把当前的仿真设置存下来,下次打开直接恢复。这是一个很多人忽略但极其省时间的功能,特别是当你需要在多个仿真配置之间来回切换时。
- 学习用 Calculator 里的函数。比如 dB20(VF("/VOUT") / VF("/VIN")) 可以直接在波形窗口里显示增益曲线,比打印两路波形再手动相除要高效得多。
最后再分享一个小技巧:在原理图里放置元件时,直接用快捷键绑定常用器件,比如把 ipamp 放到快捷键 1,vdc 放快捷键 2,gnd 放快捷键 3。这个操作在 CIW 窗口或 Display Options 里可以配置,绑定之后你会发现画图的效率提升非常明显,尤其是搭稍微大一点的电路时,基本就是狂按快捷键加小心连线,思路完全不会被工具打断。Cadence 这个软件确实有陡峭的学习曲线,但一旦熬过了头三天,后面你会越来越顺手。