VSO.ai 系列(一):原理详解与核心指令
本文是 VSO.ai 系列文章的第一篇(共两篇),主要介绍 VSO.ai 的整体概述、回归优化器(RO)与覆盖率定向求解器(CCEX)的原理及核心指令。第二篇将在此基础上,通过完整 Demo 演示从 Day0 到 Day2 的回归优化实战流程。
转载声明:本文为原创技术文章,作者为 CHY_128,首发于 CSDN。如需转载,请注明出处并保留本声明。
1. 概述
1.1 工具介绍
VSO.ai 是 Synopsys 推出针对验证回归优化的 AI 工具,通过机器学习在短时间内提升覆盖率饱和(saturation)、覆盖率多样性(diversity)、覆盖根因分析(hole RCA),简单的说就是在回归时用更短的时间达到更高的覆盖率。
VSO.ai 主要包含回归优化器 Regression Optimizer(RO,图中1)和覆盖率定向求解器 Coverage Directed Solver(CCEX,图中2AB)两部分,两个功能相对独立。回归优化器工作在仿真外层,基于历史数据,自动选取最佳的 test&seed 调用 VCS 进行仿真。覆盖率求解器工作在仿真内层,查找变量随机到 covergroup 的映射关系,在仿真内部优化随机值。

1.2 环境安装
VCS 从 2022.06 版本开始附带 VSO.ai,也可以独立安装,但要保证 VSO 版本不早于 VCS,否则 VSO 读取不了 VDB。由于 VCS 附带所以其实不需要额外安装,直接在 ~/.bashrc 添加环境变量即可。license 需要 2 个 feature:VT_VSO_GEN、VMS_COVERAGE_EXPLORER_EA。
export CSO_HOME=$VCS_HOME/cso
export PATH=$CSO_HOME/bin:$PATH
2. 功能一:回归优化器 (RO)
本章介绍回归优化器(Regression Optimizer,又称RO)的原理与使用方法。RO通过分析历史回归数据(Hit Matrix)智能选择最优的测试用例与随机种子组合,在后续迭代中以更少仿真次数达到相同或更高的覆盖率。核心操作包括:准备历史库(dbdir)、编译时开启-vso选项、通过driver --online执行优化仿真,最后生成对比报告。
2.1 核心概念
在开始使用回归优化器之前,理解以下几个关键概念对于后续的操作和结果解读至关重要:
- Hit Matrix (命中矩阵): 描述哪些测试用例(test)覆盖了哪些覆盖目标(coverpoint、assertion等)的二维矩阵。这是VSO RO进行学习和决策的全部数据基础。Hit Matrix 可以通过
vdb2hm指令从 VDB(VCS仿真数据库)文件中提取,也可以使用merge指令将新旧Hit Matrix合并,实现知识的累积。 - dbdir (历史学习库): 只读目录,用于存储过去积累的Hit Matrix数据。回归优化器基于此目录中的历史知识来指导新的仿真。
- workdir (工作目录): 本次回归的工作目录,用于存放仿真过程中的中间数据、ask&tell 交互数据以及最终结果。Day0 的 workdir 就是 Day1 的 dbdir。Day0 的 dbdir 可以为空(此时 RO无历史知识)或由之前回归的 VDB 转换而来。
- metric (覆盖率指标): 覆盖率子项,覆盖率分为功能覆盖率(covergroup、assertion)和代码覆盖率(line、toggle、FSM、condition、branch),RO 支持除 condition、branch 之外的所有 metric。
- online (在线优化): 这是 RO 的主要工作模式,对应
init+online+finalize指令。工具会自行调用VCS进行仿真,并在运行过程中动态调整测试用例和种子,是一个边跑边学习的过程。它包含 Ask-Tell(还需要人参与)和 Wrapper(RO 自动调用 VCS 迭代)两种执行方式。 - offline (离线分析): 对应
train指令。基于 VDB 或 Hit Matrix 静态分析至少哪些 test seed 组合能达到同样或更高覆盖率,进而压缩仿真时间。但因为每次回归设计都会变,上次命中的 seed 不一定对这次有效,所以更多只是做个评估。
2.2 使用方法
Day 迭代过程
基于“ Day ”的概念进行迭代是使用回归优化器的推荐流程。一个“Day”代表一次回归迭代周期,通常可对应一次RTL代码更新或回归批次。Day0 是首次建立学习库的那次回归,DayN 是用学习库优化的第 N 次回归。若验证环境(DUT+TB)发生较大变动,建议重置学习库,重新从 Day0 开始。下面是基于 Day 开展回归迭代的图文流程。
- Day0: 不开优化,传统方法编译仿真,然后将结果 VDB 转换为 dbdir。
- Day1: 开优化,基于 day0 的 dbdir 学习,online 自动完成仿真,将 day0 的 dbdir 和 day1 的 workdir 合并成 day1 的 dbdir。
- Day2: 开优化,基于 day1 的 dbdir 学习,online 自动完成仿真,…

基本工作流
这里可以简要了解,下篇文章会给一个实践流程示例详细描述完整过程。
a)数据准备: 准备 dbdir(历史库)和配置文件(告知VSO如何调用VCS)。
b)编译: 使用带-vso选项的VCS命令进行编译。
c)初始化: 执行driver --init,指定工作目录、历史库和配置文件。
d)优化回归: 执行driver --online,通过 wrapper 或 ask/tell 交互模式执行仿真。
e)报告: 执行driver --report生成优化结果报告。

2.3 关键指令
所有VSO指令均通过$(CSO_HOME)/bin/driver工具执行,下面分别介绍
编译仿真
编译仿真还是使用 VCS 原有指令,只不过需要加上-vso cso -vso_opts后缀。考虑仿真可能包含多个 build 环境,指定 buildname 名称便于区分。
vcs -vso cso -vso_opts buildname=<unique_buildname>
simv -vso cso -vso_opts testname=<testname> [-vso_opts buildname=<unique_buildname>]
VDB 转 Hit Matrix
–vdb2hm 指令可以基于仿真结果的 VDB 文件生成 Hit Matrix,--vdbdir/--vdbdirlist分别用于指定1个或多个 VDB 目录,即输入;--workdir指定工作目录,即输出;--nprocesses指定处理器核数,用于并行转换;--sub qsub用于集群 job 提交,首先要看服务器是不是组的集群,单机不需要考虑。
$(CSO_HOME)/bin/driver --vdb2hm --workdir <vso_dbdir> \
--vdbdirlist <vdbs_list> \
[or --vdbdir <vdb_dir>] \
[--nprocesses N]\
[--sub qsub|bsub --grid_opts \
<LSF or SGE Grid_Options>]
online 仿真
online 优化回归包含 Ask-Tell 和 Wrapper 两种模式,指令分别如下。
# 先ask
$(CSO_HOME)/bin/driver --ask [N] \
[--workdir <vso_workdir>]
# 然后依据ask给的信息进行仿真,就是常规仿真不是vso指令这里就不放了
# 然后tell说仿完了
$(CSO_HOME)/bin/driver --tell <RUN_ID> \
[--workdir <vso_workdir>]
# 相当于常规仿真前面加了个前缀
$(CSO_HOME)/bin/driver --online --workdir <vso_workdir> \
<user_simv>
<other_simv_options>
Hit Matrix 合并
新的回归结果和旧学习库合并生成新学习库,--workdirs指示输入目录,--workdir指示输出目录。
$(CSO_HOME)/bin/driver --merge \
--workdirs <vso_workdir>,<vso_dbdir> \
--nprocesses 8 \
--workdir <merged_vso_dbdir>
此外还有一些 merge 选项,run 的数量可以选取平均(默认)或最后一次;合并时可以选择保留所有(默认)或参考 hit。
--merge_policy[average|latest]
--merge_type [union|ref]
其他后缀
a) --target_metric
通过--target_metric指定具体优化哪些 metric,其中def指模块覆盖,inst指这个模块所有实例化的覆盖。
--target_metric {group.inst, group.def, assert.inst, asssert.def, line.inst, line.def, fsm.inst, fsm.def, tgl.inst, tgl.def}
b) --tgl/–fsm
toggle 可以配置只统计端口或所有信号。fsm 可以配置统计状态、状态间转换或两者都统计
--tgl <all|portsonly>
--fsm <state|transition|state+transition>
c) 仿真次数
online 初始化的时候可以指定最多仿真次数、达成参考覆盖率后立即停止仿真、每个 test 最少/最多跑多少次。
$(CSO_HOME)/bin/driver --init --workdir ... --dbdir ... --regr_config ... \
--max_runs 50 \
--exit_after_targets_met \
--min_runs_per_test 2 --max_runs_per_test 10 \
online 初始化时会指定 yaml 配置文件,也可以在配置文件中指定。
tests:
- name: test_2m_4s build: bld1 arguments:... min_count: 3 max_count: 20
3. 功能二:覆盖率定向求解器 (CCEX)
本章介绍覆盖率定向求解器(Coverage Directed Solver, 又称CCEX)的工作原理与使用方式。与RO在外层调度测试不同,CCEX在单次仿真内部工作,通过建立随机变量与覆盖目标的连接关系,引导求解器优先命中未覆盖的corner bin。关键操作为:编译时开启连接分析(-vso ccex -ccex_opts connect_report),仿真时按需选择单跑、并行共享或复用历史VDB三种模式,并可开启RCA分析未命中原因。
3.1 基本原理
传统约束求解器是“随机”的,容易导致高频覆盖点被反复命中,而低频覆盖点很难触及。CCEX通过以下两步解决此问题:
- 连接分析: 在编译时扫描代码,分析哪些 covergroup 的 coverpoint 受哪些随机变量和约束的影响,建立连接关系图谱。
- 定向偏置: 在仿真运行时,实时查询覆盖率状态,针对尚未命中的bin,利用连接关系图谱,智能地偏置求解器的求解方向。
CCEX的提升效果只作用于 coverpoint 和 cross 覆盖指标。它不仅能提高收敛速度,还能提供根因分析(RCA),解释某些 bin 难以命中的原因(如约束冲突、状态变量限制、采样条件未触发等)。
3.2 使用场景
按照使用场景可以分为 3 个情况:单个仿真偏、并行仿真偏和复用历史仿真结果偏。merged_vdb_dir仿真还可以回放,用于复现和调试问题。
| 模式 | 命令 | 效果 |
|---|---|---|
| 仿真内偏置(默认) | simv -vso ccex | 单个仿真内部:边跑边看自己已覆盖什么,往未覆盖方向偏 |
| 仿真间学习 | simv -vso ccex -ccex_opts merged_vdb_dir=<路径> | 多个并行仿真共享合并后的覆盖率状态,大家一起专攻共同未覆盖的 |
| 外部合并库 | simv -vso ccex -ccex_opts vdb_dir=<路径> | 有外部 VDB 合并机制,直接喂给它 |
仿真结果同时包括根因分析(RCA),也就是这个 bin 为什么打不中。手册中也说 RCA 只是尽力分析,即连接关系建立不成功的时候也可能会给不出答案。
| 类型 | 定义 | 描述 |
|---|---|---|
| UNSAT | 约束把 bin 挡住了 | 约束条件之间互相矛盾/限制太死,求解器根本生成不出能命中该 bin 的取值 |
| UNSAT FOR STATE VAR | 变量不可变 | bin 受状态变量控制,而这个状态变量在设计中变不到你要的值 |
| NOT SAMPLED | 采样没发生 | covergroup 压根没被触发(比如对应功能路径没跑到) |
3.3 关键指令
编译仿真
编译时开启 CCEX 链接检查,并输出报告,连接结果在同目录 ccex_summary.json 文件。
vcs -vso ccex -ccex_opts connect_report=<报告路径> <compile_options>
仿真时可以单独跑、可以多任务合并也可以使用外部合并 VDB。这里说一下多任务合并,merged_vdb_dir是公用的 VDB 文件,仿真结束会出现 3 个 VDB,个人理解多的这个 merge VDB 属于中间过程,合并结果还是使用编译+仿真 VDB。
simv -vso ccex <other_runtime_options>
simv -vso ccex -ccex_opts merged_vdb_dir=<VDB目录> <其他选项>
simv -vso ccex -ccex_opts vdb_dir=<VDB目录>
回放
回放时,重放参数必须与原跑完全一致。
simv <原始全部参数> -vso ccex -ccex_opts replay
simv <原始全部参数> -vso ccex -ccex_opts replay_cm_dir=<原cm_dir> -ccex_opts replay_cm_name=<原cm_name>
RCA
可以选择进行 RCA 分析,分析不能命中 bin 原因。
simv -vso ccex -ccex_opts rca <其他运行时选项>
生成报告
urg 会有新增章节说明 CCEX 结果。
urg -ccex -dir simv.vdb <其他URG选项> # 生成含 CCEX 页的报告
urg -ccex -show_ccex_details -dir simv.vdb # 显示更多细节(可跳源码/随机化位置)
更多推荐



所有评论(0)