1. VCS仿真流程概述
在数字芯片验证领域,VCS作为业界主流的仿真工具,其工作流程是每位验证工程师必须掌握的核心技能。我从事芯片验证工作多年,处理过各种规模的仿真项目,深刻体会到合理选择仿真流程对验证效率的关键影响。
VCS仿真本质上分为三个阶段:编译(compile)、 elaboration(elab)和仿真(sim)。这三个阶段可以组合成两种主要工作模式:
- 两步式流程:将compile和elab合并执行,适合中小型设计或快速迭代场景
- 三步式流程:将compile和elab分开执行,适合大型复杂设计或需要灵活调整的场景
此外,根据是否引入时序信息,仿真又可分为:
- 前仿真(Functional Simulation):仅验证逻辑功能
- 后仿真(Timing Simulation):加入SDF时序信息,验证时序行为
提示:选择流程时需要考虑设计规模、迭代频率和验证目标。小型模块验证用两步式效率更高,而SoC级验证通常需要三步式流程。
2. 两步式仿真流程详解
2.1 编译与elaboration阶段
两步式流程的核心优势在于简化操作步骤,特别适合模块级验证的快速迭代。下面这个典型命令展示了如何合并执行compile和elab:
bash复制bsub "vcs -sverilog -full64 -kdb -debug_access+all -debug_region+cell \
-error=noMPD -timescale=1ns/1ns +define+no_warning \
-f ./scripts/filelist_harden_for_local_sim.f \
-f ./scripts/mem_list.f \
-f ./scripts/stdlib.tcl \
-f ./scripts/filelist.incr \
./MemoryBist_P1.sv09 \
-top TB \
-l ./logs/comp_mbist_`date +%y%m%d_%H%M`.log"
关键参数解析:
-sverilog:启用SystemVerilog支持-full64:64位模式运行-kdb:生成知识数据库(KDB)供Verdi使用-debug_access+all:开启全功能调试-timescale:设置仿真时间单位/精度-f:指定文件列表,便于管理大量源文件-top:指定顶层模块
注意事项:使用两步式时,如果设计中有频繁修改的模块,建议将这些模块单独编译,避免每次全量编译浪费时间。
2.2 仿真执行阶段
生成simv可执行文件后,通过以下命令启动仿真:
bash复制bsub ./simv +v2k -lca +notimingcheck -ucli -i ./scripts/dump.tcl \
-l ./logs/sim_mbist_`date +%y%m%d_%H%M`.log
关键参数说明:
+v2k:启用Verilog-2001标准-lca:使用License容量优化模式+notimingcheck:禁用时序检查(前仿真)-ucli:启用UCLI交互接口-i:指定初始化脚本
实际工程经验:
- 日志文件建议包含日期时间戳,便于问题追溯
- dump.tcl通常包含波形dump命令,如
fsdbDumpfile等 - 对于大型设计,可以添加
-lca参数优化license使用
3. 三步式仿真流程解析
3.1 独立编译阶段
三步式流程的第一阶段是纯编译,使用vlogan命令:
bash复制bsub "vlogan -sverilog -full64 -kdb -timescale=1ns/1ns \
-f ./scripts/filelist_harden_for_local_sim.f \
-f ./scripts/mem_list.f \
-f ./scripts/stdlib.tcl \
-f ./scripts/filelist.incr \
./MemoryBist_P1.sv09 \
-l ./logs/comp_mbist_`date +%y%m%d_%H%M`.log"
与两步式的区别:
- 使用
vlogan而非vcs命令 - 不包含elaboration相关参数
- 生成中间编译结果而非最终simv
技巧:对于超大型设计,可以拆分filelist并行编译,最后再统一elab,显著缩短编译时间。
3.2 elaboration阶段
编译通过后,使用vcs进行elaboration:
bash复制bsub "vcs -debug_access+all -debug_region+cell -error=noMPD \
-timescale 1ns/1ps -f ./scripts/sim.tcl \
-l ./logs/elab_`date +%y%m%d_%H%M`.log \
-top TB -o ./simv"
关键变化:
- 从编译结果构建完整设计层次
- 解析时序约束和SDF注解
- 生成最终可执行的simv文件
3.3 仿真执行阶段
三步式的仿真执行与两步式基本相同:
bash复制bsub ./simv +v2k -lca +notimingcheck -ucli -i ./scripts/dump.tcl \
-l ./logs/sim_mbist_`date +%y%m%d_%H%M`.log
工程实践建议:
- 对于复杂验证环境,建议将仿真参数封装在Makefile中
- 使用
-ucli配合tcl脚本可以实现自动化仿真控制 - 日志文件建议按仿真类型分类存储
4. 后仿真流程深度解析
4.1 后仿真特点与准备
后仿真的核心差异在于引入了SDF时序信息,主要特点包括:
- 必须使用综合/布局布线后的网表
- 需要准备SDF文件(通常由物理设计工具生成)
- 仿真速度明显慢于前仿真
典型编译命令:
bash复制bsub "vlogan -sverilog -full64 -kdb -timescale=1ns/1ns \
+define+TSMC_CM_NO_WARNING +define+SDF_MAX +define+NTC +define+RECREM \
-f ./scripts/mem_list.f -f ./scripts/stdlib.tcl -f ./scripts/filelist.incr \
./pr网表文件.vg ./MemoryBist_ParallelRetentionTest_P1.sv09 \
./scripts/sdf_all.v -l ./logs/comp_mbist_`date +%m%d_%H%M`.log"
关键新增参数:
+define+SDF_MAX:启用最大延迟分析+define+NTC:忽略时序检查- 必须包含网表文件和SDF注解文件
4.2 SDF注解实现
SDF文件通过专门的模块进行加载:
verilog复制`ifdef SDF_MAX
module SDF;
TB TB_inst();
initial begin
$sdf_annotate("*.mbist_wcl_m40c_cworst_ccworst_t_setup.sdf.gz",
TB_inst.DUT_inst,,"sdf_max.log","MAXIMUM","1:1:1","FROM_MAXIMUM");
end
endmodule
`endif
技术要点:
- 使用
$sdf_annotate系统任务加载SDF - 可以同时加载多个corner的SDF
- 建议为不同corner创建独立日志
4.3 后仿真elaboration
后仿elab需要特殊处理:
bash复制bsub "vcs -debug_acc+all -debug_region+cell+encrypt -check -full64 \
+vpi -lca -file ./sim.tcl -l ./logs/elab_mbist_`date +%m%d_%H%M`.log \
-sim_res=1ps -Mdir=csrc +warn=noINAV +warn=noTFIPC +warn=noFRCREF \
+fsdb+delta -fsdb -kdb -cm line+cond+fsm+tgl +sdfverbose \
+no_notifier +neg_tchk -negdelay -top SDF -o ./simv"
关键参数:
+sdfverbose:输出详细SDF注解信息+neg_tchk:启用负时序检查-negdelay:支持负延迟-top SDF:指定SDF模块为顶层
4.4 后仿真执行与分析
后仿真执行命令:
bash复制bsub "verdi -simflow -lib ./work.lib++ -top SDF "&"
调试技巧:
- 使用Verdi分析时序违例
- 关注SDF注解警告信息
- 对关键路径进行波形对比分析
- 建议同时进行MAX/MIN corner仿真
5. 工程实践中的经验总结
5.1 流程选择策略
根据项目规模选择:
- 模块级验证:优先两步式
- 子系统验证:考虑三步式
- SoC级验证:必须三步式
根据开发阶段:
- 早期功能验证:前仿真+两步式
- 时序收敛阶段:后仿真+三步式
- 回归测试:根据改动范围选择
5.2 常见问题排查
编译阶段问题:
- 宏定义冲突:检查+define参数
- 文件缺失:验证filelist完整性
- 语法错误:查看log文件定位
仿真阶段问题:
- 初始化失败:检查testbench初始化逻辑
- 信号X态:排查复位逻辑和初始化
- 时序违例:分析时钟和约束条件
5.3 性能优化技巧
编译优化:
- 增量编译:仅编译修改过的文件
- 并行编译:使用-j参数
- 分区编译:将设计分成多个部分
仿真加速:
- 合理设置dump范围
- 使用fast模式进行初步验证
- 优化断言和覆盖率收集策略
在多年的项目实践中,我发现合理的流程选择能提升30%以上的验证效率。特别是在大型SoC项目中,采用三步式流程配合增量编译,可以显著缩短迭代周期。对于后仿真,建议建立自动化检查机制,确保SDF注解的正确性。