通过分析,对IC环境的随机效率影响较大的主要是随机constraint中有较多的多层(2层)foreach,和一些数据位宽选择较大。
下面通过比对修改前后的仿真结果,探讨一下随机约束中多层foreach和bit位宽对随机效率和机器资源的影响。
随机约束写法一表示修改之前的写法,随机约束写法二代表修改后的写法。
随机约束写法一:
1. 多层foreach约束动态数组
一维动态数组,取值在一个范围内各不相同
注:IC环境中这类变量有242个
2. int型数组表示二进制值
一维动态数组,随机分布N个1,用于产生随机时序
注:IC环境中这类变量有103个
随机约束写法二:
1. 修改多层foreach循环的约束方法,自定义函数实现
修改方法:使用randc的方式自己产生,
1)封装一个函数,产生特定范围内的随机序列
2)使用for循序,每次调用该class进行随机,得到各不相同的随机序列
在pre_randomize或者post_randomize中,调用该class
new时输入最大范围,循序数组大小相应的次数
2. 使用较少的bit范围表示数据
例如: 使用数组产生特定数目的1,在长度为48的数组中,产生随机分布的12个1,使用单bit类型:
注意:vcs和irun对.sum语法的支持不同,
vcs支持直接使用 a.sum == 12,但是不支持a.sum with(int'(item)) == 12
ius则与vcs相反。
仿真结果分析:
使用IUS仿真器,在仿真时使用-profile选项得到资源信息。
使用同一机器、在负载相同的情况下,用同样的种子仿真同一用例、
1. 仿真时间
方法一:
耗时36分16秒
方法二:
耗时23分53秒,仿真时间节省36%
2. 内存和CPU时间
方法一:
方法二:
Memory节省4%,CPU Usage节省约35%
3. 随机占用总的资源和时间
方法一:
方法二:
随机时间消耗降低了85%,随机已经不再是仿真的第一消耗。
在《Systemverilog for verification, 2nd edition》中,提到关于foreach的代价:
Using the foreach constraint creates many constraints that can slow down simulation. A good solver can quickly solve hundreds of constraints but may slow down with thousands. Especially slow are nested foreach constraints, as they produce N 2 constraints for an array of size N .
上面针对两层foreach的修改就是采用其中推荐的方法。
IC的环境相对还是比较简单的,只是需要随机的场景和参数较多,对于其他规模较大的模块或者ST环境,编写随机环境时可以适当考虑不同写法对效率和资源的影响。
在编写随机环境方面,如果有一个推荐的写作方法指导或者典型的应用,或者类似checklist之类的指南,给出不同方法对效率的影响,那对开发随机环境将具有很大的帮助。