随着芯片设计规模的不断扩大和复杂度的增加,特别是在RTL以及后仿的验证阶段,EDA工具的编译和仿真速度经常拖累设计和验证人员的工作效率。因此,编译仿真加速已经成为缩短设计周期、提高设计验证效率的关键技术。本系列集中探讨VCS和Xcelium在芯片设计验证中编译和仿真的加速技术。本文重点探讨VCS的编译仿真加速,后续会有Xcelium的编译和仿真加速汇总。欢迎大家提出自己的想法。
随着电路规模的不断变大,编译时间也成为了仿真过程中重要因素,如何加快/重用编译数据库,是加速整个仿真过程不可缺少的部分。VCS提供了很多好的技术来加速编译过程。
vcs -Mupdata design.v tb.v -o simv
当设计比较大,我们需要对某一个模块反复修改代码,进行debug的时候,如果每次都从头开始编译,那么会耗费大量的时间,分块编译(Partition Compilation)可以有效解决这个问题。
2.2.2 Autopartitioning(Ease of Adoption)
2.2.3 Specifying Partitions Manually(Recommended)
推荐使用手动的方式去指定分块编译。
2.2.3.1 topcfg.v file
首先需要编辑一个指定分块的文件,文件格式如下:
2.2.3.2 Two step commands for partition compile
2.2.3.3 Three step commands for partition compile
2.2.3.4 Profiling of Compilation Time
可以通过-pcmakeprof这个选项,来查看每个块编译所用的时间,从而进一步方便对时间久的块进行拆分。
2.2.4 Best Practice with Partition Compile
用分块编译时的几个建议。
2.2.1~2.2.4主要介绍了VCS的分块编译。分别从自动和手动两种方法,记录了VCS分块编译的方法,最后给了应用分块编译时的几点建议。
2.2.5下面给一个实例
命令:
vcs -lca -partcomp=autopartdbg -fastpartcomp=j4 -partcomp_dir=pc_dir -pcmakeprof [other options]
-fastpartcomp:调用多核并行编译。
![图片[8]-芯片验证中的编译和仿真加速(1)-Anlogic-安路社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2025/02/20250202223741238-11738507061.png?v=1738507061)
-partcomp_dir
:指定中间数据存放目录。-pcmakeprof
:生成时间消耗的log 如下图:![图片[9]-芯片验证中的编译和仿真加速(1)-Anlogic-安路社区-FPGA CPLD-ChipDebug](http://chipdebug.com/wp-content/uploads/2025/02/20250202223742625-01738507062.png?v=1738507063)
首先使用auto-partition,查看每个partition的时间消耗,对于较大的partition, 再人为分割。每个partition不宜过大过小。对于Cross-Module References (XMRs) 跨模块的引用,一个partition改动都会引起另一个partition重新编译。Partition Complie 还是lca功能,debug时可以禁用,排除EDA工具的影响。
基本上我们的服务器都能提供多核支持,VCS多线程并行编译是一种利用现代多核处理器加速编译的技术。通过将编译任务拆分成多个线程同时运行,可以有效减少编译时间,尤其是在设计规模较大时,这种方法能显著提升效率。VCS 的编译流程包括多个独立的子任务,例如,分析设计文件、编译各个模块、生成中间文件、链接阶段的任务。通过多线程方式,这些任务可以同时在多个CPU核心上运行,从而缩短整体编译时间。
示例命令:
vcs -j4 design.v -o simv
以上命令表示使用 4 个线程进行并行编译。推荐设置为机器物理 CPU 核心数的 50%-100%,视负载而定。
2.4快速编译
下图是常用的快速编译选项及其特点:
预编译库(Precompiled Library)是VCS提供的一种加速编译的方法。通过将常用的模块、设计文件或标准库预先编译为对象文件,可以避免重复编译这些文件,从而显著提高整体编译效率。下面介绍VCS中使用预编译库加速编译流程。
2.5.1.创建预编译库
使用 -o指定生成的预编译对象文件,包含需要预编译的设计文件。编译需要预编译的设计文件:
vcs -sverilog -o lib.o library_file1.sv library_file2.sv
vcs -sverilog -o lib1.o library1.sv
vcs -sverilog -o lib2.o library2.sv
2.5.2使用预编译库
vcs -sverilog -lib lib.o design.sv tb.sv -o simv
2.5.3多个预编译库的链接
vcs -incr -lib lib.o design.sv -o simv
以上是部分常见的加速VCS编译的方法,通过在不同场景下结合这些方法,可以显著减少VCS编译时间,从而提高验证的整体效率。
2.6 VCS编译及仿真时间分析及优化方法
VCS提供了一套对编译时间和仿真时间分析优化的工具,在compile 和simulation option中加入相应的option,在simulation log path会多出simulation profile log:profileReport.html,使用firefox打开html会显示出各类方法消耗掉的仿真时间,如constraint solver, function coverage, PLI等。
针对不同的env,可能时间消耗占比不太一样,通过simulation profile infor分析可以为加速提供帮助。下面介绍该工具的用法。
使用simprofile 示例,compile选项如下:
-lca -simprofile mem+time
simulation选项如下:
-simprofile time+mem +ntb_solver_debug=profile
2.6.2 CPU resource consumption:
–reportstats
具体请参考vcs userguid的5.The Unified Simulation Profiler 9.Performance Tuning。
show the summary time and mem of compile and runtime.,参考下面的选项
vcs –reportstats <OTHER_OPTS>
simv -reportstats
vcs -simprofile
simv -simprofile [time|mem]:
vcs -simprofile=uvm
优化resource_db/config_db使用wildcard;debug_xx Option优化;debug_xx会对simulation速度造成影响,如果没有使用ucli的需求,最好不要加任何debug_xx。即使需要使用ucli,也可以最好开到debug_pp,不要在ucli中使用force;在大量regression时,不要dump fsdb;Assertion, array的dump会更耗仿真速度;在chip level的仿真中,可以选择性dump fsdb,如选择某一段时间,选择某个或某几个需要关心的partition。
2.7其他加速
VCS支持-debug_pp/–debug/–debug_all参数,其中-debug_pp用于只进行波形保存后处理模式,而debug用于交互式,debug_all交互式仿真同时可以开启单步调试模式,不同的调试粒度带来更多方便的同时,也会带来性能的消耗。对于前期testbench开发,建议开启debug_all/debug参数,用于我们自己的验证环境的调试以及单步/断点调试等;当验证环境已经稳定以后,目的是进行DUT的验证一般就只开启debug_pp/debug来进行波形保存之后再调试。进入回归测试后,主要依赖验证环境中的检查器来做检查,当发现错误的时候才会打开debug_pp或者debug/debug_all来进行进一步的调试。
VCS 2014 后加入了debug_access, 之前的-debug_pp, -debug, -debug_all不再建议使用。为了更好的平衡仿真速度和debug功能,建议 配合-debug_region 使用,提供更精准的仿真控制。vcs -debug_access 时,不需要再手动配置PLI的tab file verdi.tab 和静态库pli.a,只需设置 $VERDI_HOME,vcs会自动查找所需文件,$fsdbDumpfile可以直接使用。
在影响仿真的性能参数中,文件I/O是占很大比重的一部分,所以对于性能的提升,可以从减少磁盘I/O读取来入手,比较多的磁盘I/O访问操作就是波形保存的动作。
(1)尽量只保存需要的层次结构的波形而不要总是保存所有芯片的波形
$fsdbDumpvars(1, tb_top);
$fsdbDumpvars(2, tb_top.design_inst);
(b)VPD波形保存
$vcdpluson (level|”LVL=integer”,scope*,signal*);
(2)可以指定波形保存的时间来进行波形保存
(a)在VCS运行时参数行进行指定(以FSDB为例)
+fsdb+dumpon+time[+htime ]
+fsdb+dumpoff+time[+htime]
(b)在验证环境中进行指定(以VPD为例)
$vcdpluson; // Enable Dumping
另外基于不同的验证阶段,建议使用不同调试粒度的仿真参数,也可以节省很多的仿真时间/内存消耗。
2.8 最后补充几点
1).修改设计 有些testbench里面的特殊语法会导致仿真时间变化巨大,不同的仿真阶段用不同的Memory Model也很重要,减少不必要的IO操作;
2).一般debug_all之类的去掉,关掉debug_pp;
3).调节gcc编译选项,可以设置CFLAGS;
4).用vcs的profile,仿真结束后可以查看仿真中哪些模块占用的时间和内存最多,可以的话做个优化;
config topcfg;
partition package uvm_pkg;
partition instance top.dut;
endconfig
没有回复内容