3、系统级仿真环境搭建:EDA工具选型、仿真模型库配置、仿真平台目录结构
好,咱们进入第三章。系统级仿真环境搭建,说白了就是给你的PMIC验证工作搭个台子。台子搭不好,戏就没法唱。我这些年见过太多项目,验证环境乱七八糟,最后定位问题比写代码还累。今天我就把个人积累的一些经验,掰开了揉碎了讲给你听。
3.1 EDA工具选型:Spectre / AMS / SystemVerilog
选工具这事儿,其实没有绝对的对错。关键看你的PMIC规模、团队习惯、还有预算。我个人习惯把工具分成三类来说。
3.1.1 Spectre:模拟仿真的老大哥
Spectre是Cadence家的拳头产品。做PMIC的模拟部分,比如LDO、BGR、PWM比较器,我几乎都用它。
- 精度高:晶体管级仿真,SPICE精度,跑DC、AC、瞬态都没问题。
- 收敛性好:我遇到过一些复杂的启动电路,用别的工具死活不收敛,换Spectre一次过。
- 缺点:慢。真的慢。跑一个几毫秒的软启动,可能得等一晚上。
3.1.2 AMS:混合信号仿真的桥梁
PMIC是典型的混合信号芯片。模拟部分用Spectre,数字部分用Verilog。怎么连起来?AMS就是干这个的。
AMS允许你把模拟网表和数字RTL混在一起仿真。我记得第一次用AMS时,被那个netlisting搞得头大。后来发现,关键是要搞清楚connect module的配置。
// 一个典型的AMS connect rule配置示例
connectrules ams_connect_rules;
// 模拟到数字:电压转逻辑
V2X #(.vlo(0.3), .vhi(0.7)) v2x_inst;
// 数字到模拟:逻辑转电压
X2V #(.vlo(0.0), .vhi(1.8)) x2v_inst;
endconnectrules
嗯,这里要注意:connect module的阈值设置一定要和PMIC的实际电平匹配。我曾经因为设错了阈值,导致数字模块一直采到错误的逻辑值,查了三天才找到原因。
3.1.3 SystemVerilog:数字验证的利器
如果你要做复杂的数字控制逻辑验证,比如I2C接口、状态机、故障保护逻辑,SystemVerilog是首选。配合UVM,可以搭建非常强大的验证平台。
但说实话,纯做PMIC验证的团队,用SystemVerilog的并不多。很多公司还是习惯用AMS搭个简单的testbench。我个人建议:如果你的PMIC数字部分超过5000门,还是上SV吧,否则维护成本太高。
| 工具 | 适用场景 | 速度 | 精度 | 我推荐指数 |
|---|---|---|---|---|
| Spectre | 模拟模块(LDO、BGR、ADC) | 慢 | 极高 | ★★★★★ |
| AMS | 混合信号系统级仿真 | 中等 | 高 | ★★★★☆ |
| SystemVerilog | 数字控制逻辑、UVM验证 | 快 | 逻辑级 | ★★★☆☆ |
3.2 仿真模型库配置
模型库配置,是环境搭建里最容易被忽视的一环。你想想看,模型不对,仿真结果就是垃圾。
3.2.1 工艺模型库(PDK)
这是foundry提供的,包含MOS管、电阻、电容、BJT等器件的SPICE模型。配置时要注意:
- 选对corner:TT、FF、SS、SF、FS。PMIC对工艺漂移很敏感,我建议至少跑TT和SS两个corner。
- 温度范围:PMIC通常要覆盖-40°C到125°C。别只跑室温,否则流片回来高温下可能直接挂掉。
3.2.2 行为级模型(Verilog-A / Verilog-AMS)
系统级仿真时,你不可能把每个模块都跑晶体管级。太慢了。这时候就需要行为级模型。
比如一个LDO,你可以用Verilog-A写一个简化模型:
// LDO行为级模型示例(Verilog-A)
module ldo_ideal (vout, vin, vref, en);
inout vout, vin, vref, en;
electrical vout, vin, vref, en;
parameter real vout_nom = 1.8;
parameter real iq = 10e-6;
analog begin
if (V(en) > 0.7)
V(vout) <+ V(vref) * (vout_nom / 1.2); // 简单比例关系
else
V(vout) <+ 0.0; // 关断
end
endmodule
这种模型跑得飞快,适合做系统级的功能验证。但注意:行为级模型不能替代晶体管级仿真,它只是帮你快速验证系统逻辑。
3.2.3 数字库模型
如果你的PMIC有数字部分,还需要数字标准单元库的仿真模型。通常是Verilog或VHDL的gate-level模型。配置时注意:
- 时序信息:确保SDF文件正确加载,否则后仿时序可能不准。
- 电源域:PMIC通常有多个电源域,数字库模型要支持多电压。
3.3 仿真平台目录结构
目录结构这事儿,看似简单,其实门道很多。我见过最乱的目录,所有文件堆在一个文件夹里,连个README都没有。你想想看,项目交接时得多痛苦。
下面是我个人习惯的目录结构,供你参考:
pmic_sim/
├── README.md # 项目说明,谁看了都能上手
├── setup/ # 环境配置脚本
│ ├── cds.lib # Cadence库定义
│ ├── hdl.var # 变量定义
│ └── .bashrc # 环境变量
├── models/ # 模型库
│ ├── pdk/ # 工艺模型
│ │ ├── tt/ # Typical corner
│ │ ├── ss/ # Slow corner
│ │ └── ff/ # Fast corner
│ ├── behavioral/ # 行为级模型
│ │ ├── ldo.va
│ │ ├── buck.va
│ │ └── i2c_slave.v
│ └── digital_lib/ # 数字库模型
├── testbench/ # 测试平台
│ ├── tb_top.sv # 顶层testbench
│ ├── tb_power_seq.sv # 上电时序测试
│ ├── tb_load_trans.sv # 负载跳变测试
│ └── tb_fault.sv # 故障注入测试
├── stimuli/ # 激励文件
│ ├── power_seq.do # 上电时序脚本
│ ├── i2c_cfg.txt # I2C配置序列
│ └── load_profile.csv # 负载电流波形
├── results/ # 仿真结果
│ ├── wave/ # 波形文件
│ ├── log/ # 日志文件
│ └── report/ # 报告文件
└── scripts/ # 运行脚本
├── run_ams.sh # AMS仿真启动脚本
├── run_sv.sh # SV仿真启动脚本
└── compare_results.py # 结果对比脚本
嗯,这里再补充一点:我建议在setup/目录下放一个cds.lib文件。这个文件定义了所有用到的库路径。配置好了,团队成员直接source一下就能用,不用每个人手动设置。
// cds.lib 示例
INCLUDE $PDK_DIR/cds.lib // 包含工艺库
DEFINE behavioral_lib ./models/behavioral
DEFINE testbench_lib ./testbench
DEFINE worklib ./work
最后,别忘了版本控制。我习惯用Git管理整个仿真环境。每次仿真前,把代码和模型都commit一下。这样万一仿真结果有问题,可以回溯到之前的版本,看看是不是模型变了。
好了,这一章就讲到这里。环境搭建是基础,基础打牢了,后面的验证工作才能事半功倍。下一章我们聊聊具体的仿真用例怎么写,到时候见。