2. Synopsys验证工具链概览
在SoC回归验证平台建设中,工具链不是若干软件的简单堆叠,而是一条从“代码进入”到“缺陷收敛”的流水线。Synopsys验证工具链的核心价值在于:不同工具分别承担编译仿真、调试分析、形式证明、低功耗验证和静态检查等职责,并通过统一的数据库、波形、覆盖率与报告格式互相衔接。理解它们的定位与协同关系,是搭建可复用回归平台的前提。
一、工具链的分层定位
可以把回归验证中的工具分为四层。第一层是仿真执行层,以VCS为核心,负责把RTL、Testbench、UVM环境、断言和C/C++模型编译成可执行仿真器,并产生波形、覆盖率与日志。第二层是调试分析层,以Verdi为核心,消费VCS产生的FSDB波形、KDB知识库和覆盖率数据,帮助工程师快速定位信号跳变、事务时序和断言失败原因。第三层是形式与专项验证层,包括VC Formal和VCS NLP:VC Formal用数学方法证明属性是否恒真,适合控制逻辑、仲裁器、协议状态机等;VCS NLP则面向低功耗结构,验证UPF电源域、隔离单元、保持寄存器和电源开关序列是否符合意图。第四层是静态代码质量层,以Coverity为代表,在不运行仿真的情况下检查C/C++/SystemC模型、驱动和参考模型中的空指针、越界、资源泄漏等问题。
这四层不是替代关系,而是互补关系。VCS回答“仿真时发生了什么”,Verdi回答“为什么发生”,VC Formal回答“是否在所有可能输入下都成立”,VCS NLP回答“低功耗意图是否被正确实现”,Coverity回答“代码本身是否存在静态缺陷”。
二、VCS:回归执行的主引擎
VCS在回归中的定位是“批量执行器”。一个典型SoC回归平台会为每个用例生成独立的编译产物或复用增量编译数据库,然后按种子、参数和测试名并行启动仿真。VCS的关键输出有三类:日志用于判断UVM_ERROR/UVM_FATAL数量;覆盖率数据库用于后续合并与报告;FSDB波形用于失败用例的深度调试。实际工程中通常不会为所有用例默认打开FSDB,而是采用“失败后重跑并开波形”的策略,以控制磁盘和I/O开销。
例如,一个回归任务可以这样组织:
# 编译阶段(示例)
vcs -full64 -sverilog -ntb_opts uvm-1.2 \
-debug_access+all -kdb -lca \
-cm line+cond+fsm+tgl+branch \
-f filelist.f -top tb_top -o simv
# 仿真阶段(示例)
./simv +UVM_TESTNAME=axi_burst_test \
+ntb_random_seed=12345 \
-cm line+cond+fsm+tgl+branch \
-l sim_12345.log
其中-kdb生成Verdi可读的知识库,-cm指定覆盖率类型,+ntb_random_seed保证随机可复现。回归平台需要把每个用例的退出码、UVM错误数、覆盖率数据库路径和日志路径写入统一结果表,供后续汇总。
三、Verdi:从失败现象到根因
Verdi不参与仿真执行,而是消费VCS产生的数据。它的核心价值在于把“日志里的一行错误”还原为“某个信号在某个时钟沿的错误跳变”。在回归平台中,Verdi通常以两种方式介入:一是工程师手动打开失败用例的FSDB,使用nTrace、nWave和nSchema追踪驱动源;二是平台自动提取断言失败时间点、事务ID和关键信号,生成调试摘要。
一个高效的调试闭环是:回归平台发现UVM_ERROR后,自动重跑该用例并开启FSDB,然后把波形路径、失败时间和随机种子写入缺陷单。工程师在Verdi中加载KDB后,可以直接从断言失败跳转到相关RTL行,再沿驱动链回溯到激励或配置错误。这样,Verdi就把VCS的“批量结果”转化为“可定位的根因”。
四、VC Formal:把“测过”变成“证过”
VC Formal在回归中的定位是“属性证明器”。它不依赖激励,而是对SVA属性或自动提取的属性进行数学求解,给出proven、falsified、inconclusive等结果。对于SoC中的仲裁器、FIFO指针、握手协议、寄存器访问权限等模块,形式验证可以在回归早期发现仿真难以覆盖的边界情况。
在协同关系上,VC Formal与VCS共享RTL和SVA源文件,但运行方式不同。回归平台可以把形式验证作为独立任务集,按模块和属性分组运行,并把反例波形导出给Verdi分析。一个实用做法是:对每个形式属性设置prove或cover目标,把falsified属性自动转为缺陷,把inconclusive属性标记为需要增加约束或拆分证明。
五、VCS NLP:低功耗意图的仿真检查
VCS NLP(Native Low Power)在VCS仿真基础上增加UPF感知能力,用于验证电源域、隔离单元、电平转换器、保持寄存器和电源开关序列。它的输入是RTL、UPF和低功耗测试用例,输出是低功耗违例报告和波形。与普通功能仿真不同,NLP需要关注电源状态切换时的信号行为,例如某信号在电源关闭后是否被隔离、保持寄存器是否在掉电期间保持正确值。
在回归平台中,NLP任务通常单独分组,因为UPF配置和电源序列会显著影响仿真行为。平台需要把UPF文件、电源状态序列和功能用例组合成低功耗回归集,并把违例报告与功能失败分开统计,避免把低功耗问题误判为功能缺陷。
六、Coverity:静态质量守门员
Coverity面向C/C++/SystemC代码,在编译前或编译过程中进行静态分析,发现空指针解引用、数组越界、资源泄漏、未初始化变量等问题。在SoC验证平台中,Coverity主要检查参考模型、DPI-C代码、驱动和测试平台中的C++部分。它不产生波形,也不依赖仿真激励,但能在回归之前拦截一批“代码级”缺陷。
协同方式上,Coverity通常作为CI流水线的前置检查:代码提交后先跑Coverity,缺陷达到阈值则阻断后续回归。回归平台可以把Coverity报告与VCS失败用例关联起来,例如某个C模型越界导致仿真崩溃,Coverity报告可以作为根因证据。
七、工具链协同的关键接口
要让上述工具真正协同,回归平台需要统一管理四类接口:源文件与编译选项(RTL、UPF、SVA、C++、filelist)、运行参数(种子、测试名、覆盖率类型、波形开关)、数据产物(日志、FSDB、KDB、覆盖率数据库、形式反例、静态报告)和结果判据(错误数、覆盖率、证明状态、违例等级)。
一个可落地的回归结果表可以包含如下字段:用例名、工具类型(VCS/NLP/Formal/Coverity)、随机种子、运行状态、UVM错误数、覆盖率增量、波形路径、报告路径、缺陷编号。这样,VCS负责“跑”,Verdi负责“看”,VC Formal负责“证”,VCS NLP负责“查低功耗”,Coverity负责“守代码”,五者通过统一数据接口形成闭环。