论文部分内容阅读
摘要:近年来,由于设计复杂度的增长,对于验证提出了更高的要求。验证环境变得越来越大,越来越复杂,设计和验证的双重压力导致仿真变得越来越慢。所有验证/仿真的速度已经成为当前SOC设计进程中的重大挑战。本文网络版地址:http://www.eepw.com.cn/article/192738.htm
关键词:SoC;Synopsys;验证
DOI: 10.3969/j.issn.1005-5517.2013.12.013
在我们的项目中,我们使用Synopsys的验证flow以及近年来Synopsys提供的新的方法/工具,比如性能分析工具来分析仿真瓶颈,使用分块编译来加速编译,使用并行多核技术来加速编译/运行。使用UVM来增加环境的可复用性,等等,这些技术/特性的引入都大幅度加速了我们的仿真速度并减少了仿真时间。
我们的项目是GPU的项目,对于仿真性能有较高的要求,所以在项目中希望使用尽可能多的新技术来缩短仿真时间以及加速验证。
我们的验证环境使用UVM标准库来搭建的。验证环境如图1所示。
使用了Synopsys公司的VCS来作为我们的仿真工具。
工具版本:VCS 2012.09-SP1,Verdi 2013.04
硬件环境如表1所示。
加速编译的方法
随着电路规模的不断变大,编译时间也成为了仿真过程中重要因素,如何加快/重用编译数据库,是加速整个仿真过程不可缺少的部分。VCS提供了很多好的技术来加速编译过程。
并行编译
当前基本上我们的服务器都能提供多核支持,并行编译选项可以使用服务器的多核来提供更快的并行处理,来快速编译生成数据库。VCS并行编译的选项如下:
-j[no_of_processes]
比如 vcs –j4 ?,注意no_of_ processes的数目不要超过实际可以提供的物理核数目。
增量编译
在编译过程中,VCS会创建设计/验证的层次结构,当你重新编译的时候,VCS只会就那些更改的设计单元进行重新编译,这样可以缩短编译时间。现在增量编译选项已经成为VCS的默认选项。
分区编译 (Partition Compile)
分区编译是VCS提供的一个比较新的特性。这个特性可以让我们把设计/验证中的实例/模块分成不同的大得区块来编译。这样如果之后只对其中一部分区块相关的文件进行了修改,那么可以重用之前分区编译的数据库来减少其它区块编译的时间,只对修改的区块进行重新编译即可。同时针对验证环境中的package,比如像UVM标准库或者一些算法库,分区编译也可以提前把它们分块编译好,然后这样可以加速验证环境的编译速度。
在仿真过程中,运行的时间以及内存消耗是单次仿真的主要瓶颈,因此本文会关注在运行过程中如何提升性能,包括如何找到运行过程的瓶颈以及使用多核技术来加速仿真。
运行性能分析工具
VCS提供了用于分析性能的Profile工具Simprofile,使用在仿真过程中生成时间/内存消耗的报告,然后可以通过对于报告的分析来找到限制当前仿真性能的瓶颈。使用方式:
编译:%VCS –simprofile –lca –f
flelist.f ?
运行:%simv –simprofle time|mem
一般在运行后会自动生成名为simprofile_dir的报告目录,也可以后处理生成报告:
%profrpt –output_dir simprofle_dir–view time_all|mem_all
Simprofile会默认生成基于HTML的报告,然后可以进行选择查看相关的性能选项(支持模块/功能/DPI/ PLI/约束/覆盖率等),同时支持对多次仿真的报告进行比较。
多核仿真技术
VCS提供了多核仿真技术用于使用服务器的物理多核来加速仿真。使用多核技术可以把一次仿真的不同部分分配到多个物理运算单元上以达到加速仿真的目的。现在提供了两种多核模式:应用级并行技术(ALP)和设计级并行技术(DLP),ALP/DLP以及二者的组合通过多核CPU来优化仿真进程。
应用级多核技术(ALP)
应用级多核技术(ALP)是把按照应用把验证的不同部分(Testbench、SystemVerilog断言、覆盖率统计、波形保存等等)放到多个处理核上去做并行运行。
例如:在一个4核服务器上我们可以把覆盖率统计放到第一个核上,把断言检测放到第二个核上,把波形保存放到第三个核上,剩下的仿真放到最后一个核上。结果会看到仿真性能可以得到很大提升。表1是ALP支持的开关参数以及推荐的使用示例
如果VCS使用了ALP+fsdb多核(+mtfsdb),那么会在控制台看到如下打印:
*Novas* : Multi-Thread VCS dumping is enabled
同时Verdi3自动支持对FSDB进行并行保存,如果使能了并行保存,那么会有如下信息:
*Novas* : Enable parallel dumping
设计级多核技术(DLP)
DLP允许我们可以把一个大的设计分成多个区块,然后把不同的区块放入不同的计算核去运行。DLP的一般会根据profiler的报告结果以及设计部件之间的相关性分析来做划分。把划分写入一个配置文件中,然后把这个配置文件读入VCS进行仿真,比如:
%vcs test.v–parallel+design=partition_cfg.cfg 同时DLP还支持自动分区划分。考虑到DLP的适用情况以及进度,我们的项目上暂时没有使用,会在后继的项目中进行尝试。
其他进行性能加速的模式
Debug参数
在影响仿真的性能参数中,文件I/O是占很大比重的一部分,所以对于性能的提升,可以从减少磁盘I/O读取来入手,比较多的磁盘I/O访问操作就是波形保存的动作。
(1)尽量只保存需要的层次结构的波形而不要总是保存所有芯片的波形
(a)FSDB波形保存
$fsdbDumpvars(1, tb_top);
$fsdbDumpvars(2, tb_top.design_ inst);
(b)VPD波形保存
$vcdpluson (level|"LVL=integer",sco pe*,signal*);
(2)可以指定波形保存的时间来进行波形保存
(a)在VCS运行时参数行进行指定(以FSDB为例)
+fsdb+dumpon+time[+htime ]
+fsdb+dumpof+time[+htime]
(b)在验证环境中进行指定(以VPD为例)
$vcdpluson; // Enable Dumping
#5 $vcdplusof; //Disable Dumping afer 5ns
为了能找到最适合我们验证环境的性能仿真模式(包括编译、执行和仿真),以使得我们能得到最大的性能提升增益,我们定义了三种场景模式进行测试,三种模式是:不保存波形、保存FSDB波形和保存VPD波形。然后每种模式下我们还会分为做覆盖率收集和不做覆盖率收集两种情况。
在模式1 (不保存波形中)我们有四个基础场景,然后针对着四个基础场景,来进行了如下的组合,编译:是否开启快速编译,运行是否开启debug_all/debug_pp,是非开启覆盖率ALP,共扩展运行为24个场景。
在模式2(保存vpd波形)针对两个基础场景,选择是否开启和模式1类似的参数,同时还选择是否进行vpd波形ALP,总共运行16个场景。
模式3(保存fsdb波形)针对两个基础场景,在进行和模式2类似的组合之后还组合了是使用verdi3进行波形并行保存还是FSDB ALP,用于比较二者的性能差别。
模式1下各场景仿真性能比较
模式1下的性能比较如表3所示,从表3的运行结果可以看到快速编译有10%~40%的性能提升,多核技术的使用有最多20+%的速度提升,使用了性能参数之后整体仿真有最大20%的性能提升。
模式2下各场景仿真性能比较
在模式2下的各场景性能比较如表4所示。
(1)不做覆盖率分析
快速编译会有最多2倍左右的编译时间提升,并行VPD保存会有最多20%的仿真时间提升。对于内存空间最多有1.5倍的虚拟内存空间减少以及3倍的memory空间减少。
(2)做覆盖率分析
快速编译会有大概2倍左右的编译时间提升,就总的仿真时间,大概提升1%左右。
多核并行VPD保存以及并行覆盖率分析对于正常用例仿真时间有1%~9%的提升,会有2倍~3倍的内存使用减少。
模式3各场景仿真性能比较
在开启FSDB波形保存的场景三,性能比较如表5所示。
(1)关闭覆盖率分析
Verdi3的并行开关比ALP的并行保存快2%左右,二者性能基本相同。快速编译会有2倍以上的编译时间减少,总仿真时间基本相同。并行保存会带来30%+的仿真时间减少。
(2)开启覆盖率分析
从在项目中的结果来看,使用快速编译选项可以带来最大2倍的编译时间提升。当我们运行回归测试时,如果不做波形保存,快速编译选项是很好的选择。并行多核技术可以对于运行时间给与很大的性能提升,不管是进行VPD波形保存还是FSDB波形保存,使用ALP技术都能带来20%以上的性能提升,性能提升显著。
另外基于不同的验证阶段,建议使用不同调试粒度的仿真参数,也可以节省很多的仿真时间/内存消耗。后继我们会考虑使用DLP技术以及一些更新的有关performance的工具去尝试对性能进行进一步的优化。
关键词:SoC;Synopsys;验证
DOI: 10.3969/j.issn.1005-5517.2013.12.013
在我们的项目中,我们使用Synopsys的验证flow以及近年来Synopsys提供的新的方法/工具,比如性能分析工具来分析仿真瓶颈,使用分块编译来加速编译,使用并行多核技术来加速编译/运行。使用UVM来增加环境的可复用性,等等,这些技术/特性的引入都大幅度加速了我们的仿真速度并减少了仿真时间。
我们的项目是GPU的项目,对于仿真性能有较高的要求,所以在项目中希望使用尽可能多的新技术来缩短仿真时间以及加速验证。
我们的验证环境使用UVM标准库来搭建的。验证环境如图1所示。
使用了Synopsys公司的VCS来作为我们的仿真工具。
工具版本:VCS 2012.09-SP1,Verdi 2013.04
硬件环境如表1所示。
加速编译的方法
随着电路规模的不断变大,编译时间也成为了仿真过程中重要因素,如何加快/重用编译数据库,是加速整个仿真过程不可缺少的部分。VCS提供了很多好的技术来加速编译过程。
并行编译
当前基本上我们的服务器都能提供多核支持,并行编译选项可以使用服务器的多核来提供更快的并行处理,来快速编译生成数据库。VCS并行编译的选项如下:
-j[no_of_processes]
比如 vcs –j4 ?,注意no_of_ processes的数目不要超过实际可以提供的物理核数目。
增量编译
在编译过程中,VCS会创建设计/验证的层次结构,当你重新编译的时候,VCS只会就那些更改的设计单元进行重新编译,这样可以缩短编译时间。现在增量编译选项已经成为VCS的默认选项。
分区编译 (Partition Compile)
分区编译是VCS提供的一个比较新的特性。这个特性可以让我们把设计/验证中的实例/模块分成不同的大得区块来编译。这样如果之后只对其中一部分区块相关的文件进行了修改,那么可以重用之前分区编译的数据库来减少其它区块编译的时间,只对修改的区块进行重新编译即可。同时针对验证环境中的package,比如像UVM标准库或者一些算法库,分区编译也可以提前把它们分块编译好,然后这样可以加速验证环境的编译速度。
在仿真过程中,运行的时间以及内存消耗是单次仿真的主要瓶颈,因此本文会关注在运行过程中如何提升性能,包括如何找到运行过程的瓶颈以及使用多核技术来加速仿真。
运行性能分析工具
VCS提供了用于分析性能的Profile工具Simprofile,使用在仿真过程中生成时间/内存消耗的报告,然后可以通过对于报告的分析来找到限制当前仿真性能的瓶颈。使用方式:
编译:%VCS –simprofile –lca –f
flelist.f ?
运行:%simv –simprofle time|mem
一般在运行后会自动生成名为simprofile_dir的报告目录,也可以后处理生成报告:
%profrpt –output_dir simprofle_dir–view time_all|mem_all
Simprofile会默认生成基于HTML的报告,然后可以进行选择查看相关的性能选项(支持模块/功能/DPI/ PLI/约束/覆盖率等),同时支持对多次仿真的报告进行比较。
多核仿真技术
VCS提供了多核仿真技术用于使用服务器的物理多核来加速仿真。使用多核技术可以把一次仿真的不同部分分配到多个物理运算单元上以达到加速仿真的目的。现在提供了两种多核模式:应用级并行技术(ALP)和设计级并行技术(DLP),ALP/DLP以及二者的组合通过多核CPU来优化仿真进程。
应用级多核技术(ALP)
应用级多核技术(ALP)是把按照应用把验证的不同部分(Testbench、SystemVerilog断言、覆盖率统计、波形保存等等)放到多个处理核上去做并行运行。
例如:在一个4核服务器上我们可以把覆盖率统计放到第一个核上,把断言检测放到第二个核上,把波形保存放到第三个核上,剩下的仿真放到最后一个核上。结果会看到仿真性能可以得到很大提升。表1是ALP支持的开关参数以及推荐的使用示例
如果VCS使用了ALP+fsdb多核(+mtfsdb),那么会在控制台看到如下打印:
*Novas* : Multi-Thread VCS dumping is enabled
同时Verdi3自动支持对FSDB进行并行保存,如果使能了并行保存,那么会有如下信息:
*Novas* : Enable parallel dumping
设计级多核技术(DLP)
DLP允许我们可以把一个大的设计分成多个区块,然后把不同的区块放入不同的计算核去运行。DLP的一般会根据profiler的报告结果以及设计部件之间的相关性分析来做划分。把划分写入一个配置文件中,然后把这个配置文件读入VCS进行仿真,比如:
%vcs test.v–parallel+design=partition_cfg.cfg 同时DLP还支持自动分区划分。考虑到DLP的适用情况以及进度,我们的项目上暂时没有使用,会在后继的项目中进行尝试。
其他进行性能加速的模式
Debug参数
在影响仿真的性能参数中,文件I/O是占很大比重的一部分,所以对于性能的提升,可以从减少磁盘I/O读取来入手,比较多的磁盘I/O访问操作就是波形保存的动作。
(1)尽量只保存需要的层次结构的波形而不要总是保存所有芯片的波形
(a)FSDB波形保存
$fsdbDumpvars(1, tb_top);
$fsdbDumpvars(2, tb_top.design_ inst);
(b)VPD波形保存
$vcdpluson (level|"LVL=integer",sco pe*,signal*);
(2)可以指定波形保存的时间来进行波形保存
(a)在VCS运行时参数行进行指定(以FSDB为例)
+fsdb+dumpon+time[+htime ]
+fsdb+dumpof+time[+htime]
(b)在验证环境中进行指定(以VPD为例)
$vcdpluson; // Enable Dumping
#5 $vcdplusof; //Disable Dumping afer 5ns
为了能找到最适合我们验证环境的性能仿真模式(包括编译、执行和仿真),以使得我们能得到最大的性能提升增益,我们定义了三种场景模式进行测试,三种模式是:不保存波形、保存FSDB波形和保存VPD波形。然后每种模式下我们还会分为做覆盖率收集和不做覆盖率收集两种情况。
在模式1 (不保存波形中)我们有四个基础场景,然后针对着四个基础场景,来进行了如下的组合,编译:是否开启快速编译,运行是否开启debug_all/debug_pp,是非开启覆盖率ALP,共扩展运行为24个场景。
在模式2(保存vpd波形)针对两个基础场景,选择是否开启和模式1类似的参数,同时还选择是否进行vpd波形ALP,总共运行16个场景。
模式3(保存fsdb波形)针对两个基础场景,在进行和模式2类似的组合之后还组合了是使用verdi3进行波形并行保存还是FSDB ALP,用于比较二者的性能差别。
模式1下各场景仿真性能比较
模式1下的性能比较如表3所示,从表3的运行结果可以看到快速编译有10%~40%的性能提升,多核技术的使用有最多20+%的速度提升,使用了性能参数之后整体仿真有最大20%的性能提升。
模式2下各场景仿真性能比较
在模式2下的各场景性能比较如表4所示。
(1)不做覆盖率分析
快速编译会有最多2倍左右的编译时间提升,并行VPD保存会有最多20%的仿真时间提升。对于内存空间最多有1.5倍的虚拟内存空间减少以及3倍的memory空间减少。
(2)做覆盖率分析
快速编译会有大概2倍左右的编译时间提升,就总的仿真时间,大概提升1%左右。
多核并行VPD保存以及并行覆盖率分析对于正常用例仿真时间有1%~9%的提升,会有2倍~3倍的内存使用减少。
模式3各场景仿真性能比较
在开启FSDB波形保存的场景三,性能比较如表5所示。
(1)关闭覆盖率分析
Verdi3的并行开关比ALP的并行保存快2%左右,二者性能基本相同。快速编译会有2倍以上的编译时间减少,总仿真时间基本相同。并行保存会带来30%+的仿真时间减少。
(2)开启覆盖率分析
从在项目中的结果来看,使用快速编译选项可以带来最大2倍的编译时间提升。当我们运行回归测试时,如果不做波形保存,快速编译选项是很好的选择。并行多核技术可以对于运行时间给与很大的性能提升,不管是进行VPD波形保存还是FSDB波形保存,使用ALP技术都能带来20%以上的性能提升,性能提升显著。
另外基于不同的验证阶段,建议使用不同调试粒度的仿真参数,也可以节省很多的仿真时间/内存消耗。后继我们会考虑使用DLP技术以及一些更新的有关performance的工具去尝试对性能进行进一步的优化。