1. 项目概述:8bit 40M采样率异步SAR ADC设计实录
去年用smic18mmrf工艺流片的这个异步SAR ADC,算是我带过最省心的ADC项目之一。40MHz采样率下能达到7.84bit有效位数(ENOB),对于采用1.8V电源电压的180nm工艺来说算是摸到了工艺极限。整个设计从架构选型到后仿验证只用了三个月,关键是把动态比较器的延迟时间压到了1.2ns以内,让异步时钟能稳定工作在40MHz频率上。
这个项目的核心价值在于:它完整实现了从电路设计到物理实现的闭环验证。包括栅压自举开关、Vcm-Based CDAC阵列、两级动态比较器、异步时钟生成等核心模块都通过了DRC/LVS/ANT检查,测试电路和后仿文件也经过实际流片验证。特别适合想入门ADC设计的工程师,所有仿真参数都已预设好,导入Cadence就能直接跑起来。
2. 核心电路设计解析
2.1 栅压自举开关设计要点
这个项目的采样质量全靠栅压自举开关撑着。采用交叉耦合的PMOS/NMOS结构(W/L=2μm/0.18μm),关键是要确保栅源电压Vgs随输入信号浮动。在实际版图布局时要注意:
- 电荷注入补偿电容要放在靠近开关管的位置,我用的是2fF的MIM电容
- boot_clock信号的上升时间必须控制在300ps以内,实测超过500ps会导致ENOB下降0.2bit
- 保护环要采用双环结构,内环接VDD,外环接GND,能降低衬底噪声耦合
重要提示:后仿时发现当输入信号超过1.6Vpp时,自举电容会出现电荷泄漏,需要在仿真脚本中添加如下设置:
code复制saveOptions options save=selected save Vboot_node
2.2 Vcm-Based CDAC阵列实现
采用上级板采样结构节省了2个单元电容,8bit分辨率下总电容值为256C(C=20fF)。开关时序控制是核心难点:
verilog复制always @(posedge clk) begin
samp_phase <= ~comp_out;
dac_ctrl <= samp_phase ? vcm : vref;
end
版图设计时必须注意:
- 电容阵列要采用共质心布局,降低梯度误差
- 开关管的宽长比要逐位递减(MSB到LSB)
- 金属走线要等长匹配,时序偏差超过200ps会导致DNL恶化
蒙特卡洛仿真结果显示,在SS_125工艺角下INL仍能保持在±0.8LSB以内。建议跑仿真时添加如下参数:
code复制montecarlo variations=1000
3. 动态比较器设计技巧
3.1 两级动态结构优化
第一级预放大器的增益控制在15dB(约5.6倍),采用PMOS差分对管,W/L=10μm/0.18μm。关键设计参数:
| 参数 | 目标值 | 实测范围 |
|---|---|---|
| 失调电压 | <±5mV | ±4.3mV |
| 延迟时间 | 0.8ns | 0.7-1.1ns |
| 功耗 | 0.4mW | 0.38-0.42mW |
再生阶段的时序控制要特别注意:
verilog复制assign latch_en = async_clk & ~reset;
当输入差分电压低于0.8mV时,误判率会急剧上升。解决方法是在版图中添加dummy晶体管平衡布局不对称性。
3.2 异步时钟生成电路
采用环形振荡器结构生成异步时钟,核心延迟参数需要根据布线结果调整:
verilog复制always @(negedge comp_ready) begin
#1.7 clk_phase <= ~clk_phase; // 工艺相关延迟
end
实测数据表明:
- 电源噪声超过50mVpp时,ENOB会下降0.5bit
- 时钟抖动需要控制在50ps RMS以内
- 建议在电源轨添加0.1μF+10nF的去耦电容组合
4. 仿真与验证实战
4.1 前仿与后仿对比
仿真环境配置要点:
- 使用spectre仿真器,精度设置为moderate
- 添加工艺角文件:smic18mmrf_tt.lib
- 噪声模型选择apsnoise
性能对比:
| 指标 | 前仿结果 | 后仿结果 |
|---|---|---|
| ENOB | 7.94bit | 7.377bit |
| SFDR | 58.7dB | 54.2dB |
| 功耗 | 3.2mW | 3.8mW |
4.2 电源噪声影响分析
工程中隐藏的noise_inject.pl脚本可以模拟电源干扰:
bash复制perl noise_inject.pl -mode random -amp 50mV -freq 1M-50M
重要发现:
- 当噪声频率接近20MHz时,二次谐波会升高6dB
- 解决方法是在电源pad附近添加深N阱隔离
- 建议运行以下仿真脚本验证:
code复制noise freq=1M to=50M points=100
5. 版图设计经验
5.1 匹配结构布局技巧
- CDAC阵列采用4×4共质心布局
- 比较器输入对管使用交叉耦合结构
- 时钟走线采用Shielded差分对
- 电源线宽不低于5μm(1mA/μm规则)
5.2 DRC问题规避
常见DRC错误及解决方法:
| 错误类型 | 出现位置 | 解决方法 |
|---|---|---|
| ANT | 电容阵列上方 | 添加dummy金属层 |
| LVS | 电源环连接处 | 检查label命名一致性 |
| Density | 空白区域 | 添加fill器件 |
6. 实测性能优化
6.1 输入频率响应特性
实测发现当输入信号频率超过18MHz时,ENOB开始下降。通过调整采样率可以改善:
| 采样率 | 输入20MHz时ENOB |
|---|---|
| 40MHz | 6.8bit |
| 32MHz | 7.2bit |
| 28MHz | 7.5bit |
根本原因是工艺寄生电容导致CDAC建立时间不足。下次改版建议:
- 在CDAC顶板走线添加shield层
- 将单位电容从20fF增大到25fF
- 优化开关管驱动强度
6.2 理想DAC替换注意事项
当把testbench中的理想DAC替换为实际电路时,需要在仿真脚本中添加:
verilog复制initial begin
force tb.adc_top.dac_model.resolution = 8;
#100 release tb.adc_top.dac_model.resolution;
end
这个技巧可以避免某些仿真器的单位初始化问题。全工艺角仿真建议使用分布式计算,单个corner在i5-8265U上约需30分钟。
7. 工程部署建议
整个项目已打包为Docker镜像,部署步骤如下:
- 安装Cadence IC617或更高版本
- 加载镜像:
docker load < sar_adc.img - 启动环境:
cadence -i sar_adc.img - 工程路径:
/workspace/sar_adc_8bit
包含的实用工具:
- 一键仿真脚本:
run_sim.sh - 结果分析工具:
result_parser.py - 版图检查工具:
layout_check.pl
对于想深入学习的工程师,建议重点关注这几个脚本:
scripts/setup_simulation.tcl- 仿真环境配置layout/constraints.il- 版图约束条件verilog/async_control.v- 异步状态机实现