当前位置:网站首页>SystemVerilog仿真速率提升
SystemVerilog仿真速率提升
2022-06-27 00:46:00 【Alfred.HOO】
做动态仿真验证通常会遇到要等待仿真结果的情况,特别是在调试某个测试用例的时候。很多时候,工程师们会自然地认为仿真速度大部分依赖于跑仿真任务的服务器本身的性能,以及EDA仿真工具的能力。而实际上,高效的验证环境以及代码质量也是影响仿真速度的关键因素。
另一方面,提高仿真速度这回事,对于芯片工程师来说本身就是“求人不如求己”。提高服务器机器性能意味着更大的资金投入,更高性能的仿真工具也不是一时半会能达成的。而探索更高效的验证方法学,构建更高执行效率的代码是当下就能做的事情。
本文的主要内容参考来自于Cliff Cummings在2019年DVCon会议上发表的文章:Yikes! Why is My SystemVerilog Still So Slooooow. 这篇文章主要探讨了SystemVerilog仿真速度跟Coding风格之间的关系,文章中有详细的实验目标、方法和数据结果呈现。本文将摘录和分析那些对仿真速度影响较大的编码风格。
1.使用向量操作代替单bit操作
仿真器在做完整向量计算的速度比单bit计算要高。根据参考文献的数据,在某款仿真工具下,最高提速可以达到3倍以上。
下面是一个例程,分别呈现不同的代码实现风格。
2.避免在循环中实例化对象
这个技巧关系到内存的分配和回收。低效的内存管理会导致严重的cache miss、堆栈管理开销和垃圾回收开销,尽管这些都是操作系统帮我们做的。
当我们需要一种新的数据结构时,可以使用结构体struct就不用class,类的例化和垃圾回收都是开销。创建一个对象的时候,不要上来就是一个new,可以考虑是否可以重用之前创建过的对象。
如下例程,应用这个技巧在三款主流仿真工具上都能带来仿真速度收益,最高有超过一半的速度提升。
3.条件判断字符串处理
在仿真过程中不断地打印信息或者读写文件会导致仿真速度非常慢,毕竟调用计算机IO效率并不高。在UVM中有健全的report管理机制,可以根据设定的verbosity等级来判断是否需要打印信息出来。
除了信息打印,字符串的格式处理也是很大的开销。如果借用report的管理机制来判断是否有必要进行字符串格式处理,可以非常有效地提高仿真速度。
如下例程,带有条件判断的代码在三款主流仿真工具上都能带来仿真速度收益,而且这个收益非常大,达到了33倍~100倍。
4.减少不必要的端口采样或驱动
这是另一种减少不必要操作的技巧。要知道在UVM中,操作TLM analysis port是开销比较大的,因为端口的驱动行为,都会通过回调机制来执行关联到该端口的所有consumer的端口动作。理解这个实现机制,其实还得看看UVM的源码,这里就不做展开解析了。
此外,某些个analysis port是否连接到其他component是依赖于当前的验证环境的,如果根据analysis port的状态判断是否进行端口驱动,可以减少一些不必要的操作。
如下例程,在monitor的run_phase中根据其analysis port状态来进行端口采样和广播给其他组件,可以带来一部分的仿真速度收益。
5.用回调函数代替低效的随机约束
SystemVerilog提供了很多种随机化变量和添加随机约束的方法,具体可以参考公众号的另外两篇文章《暗藏玄机的SV随机化》《五花八门的SystemVerilog随机约束》。在设计随机约束的时候,除了要确保约束不冲突(即约束有解)之外,还需要避免产生无效的约束解。
其实,SV已经提供了pre_randomize() / post_randomize()两个分别在求解随机值前后会执行的回调函数。灵活使用这两个函数可以避免一些非常低效的约束行为。
如下例程,使用post_randomize对随机后的数列进行排序,可以避免在约束中使用循环去限制每一个数列元素,从而获得数十倍的仿真速度提升。
边栏推荐
- Kept to implement redis autofailover (redisha) 16
- 对象的访问机制及其他
- 3线spi屏幕驱动方式
- 接口隔离原则
- Central Limit Theorem
- Keepalived 实现 Redis AutoFailover (RedisHA)17
- 自定义JSP[if,foreach,数据,select]标签
- Summary of working at home during the epidemic | community essay solicitation
- 理想L9产品力分析:售价45.98万,采用四缸发动机,续航1315公里
- NLP: brief introduction of transformer in NLP natural language field (pre training technology), NLP model development (elmo/gpt/bert/mt-dnn/xlnet/roberta/albert), detailed introduction to classic case
猜你喜欢

使用NetworkX对社交网络进行系统的分析:Facebook网络分析案例

Summary of working at home during the epidemic | community essay solicitation

Flink practical problems (VII): no watermark (watermarks are only available eventtime is used)

How to control the quality of HD slip ring in the production process

用代码生成流程图,Markdown的使用方法

Central Limit Theorem

接口测试框架实战(一) | Requests 与接口请求构造

Interface test framework practice (I) | requests and interface request construction

乔治·华盛顿大学 : Hanhan Zhou | PAC:多智能体强化学习中具有反事实预测的辅助价值因子分解

LeetCode 142. 环形链表 II
随机推荐
CH423要如何使用,便宜的国产IO扩展芯片
Keepalived 实现 Redis AutoFailover (RedisHA)15
统一结果集的封装
Timing mechanism of LwIP
Is it safe to open a securities account online? Is it reliable to speculate in stocks by mobile phone
Count the logarithm of points that cannot reach each other in an undirected graph [classic adjacency table building +dfs Statistics - > query set optimization] [query set manual / write details]
Employment prospect of GIS and remote sensing specialty and ranking selection of universities in 2022
IIS 部署静态网站和 FTP 服务
Play OLED, u8g2 animation, increasing numbers, random triangles, etc
Keepalived 实现 Redis AutoFailover (RedisHA)14
Memcached foundation 2
3-wire SPI screen driving mode
getReader() has already been called for this request
Topolvm: kubernetes local persistence scheme based on LVM, capacity aware, dynamically create PV, and easily use local disk
Online text digit recognition list summation tool
Statistical Hypothesis Testing
美团:踩雷好几年,才总结出的数据治理避坑攻略
在线文本数字识别列表求和工具
Esp32 add multi directory custom component
接口隔离原则