Case:
有一个DUT cfg , 可以在simulation过程中动态配置,并有一定的constraint;但是在某一种模式下存在limitation导致该变量必须保持不变而其它变量还是可以random,由于testplan是没有预期到这个limitaion,所以并没有做特殊处理。所以想到直接把该变量rand_mode设为0;结果发现在simulation的时候报错,指示其default值不在constraint里面。
Reason:
虽然该变量的rand_mode已经关闭,相当于该变量取的是default值,但simulator依然要去检查其是否在constraint里面,导致检查失败
Solution:
- 将constraint里面加入其default value作为合法值
- 如果该变量的合法值受限于其它变量并不一定能保证其default值即是合法值,那么可以将所有对该变量进行constraint的条件写在一个constraint里面,使用constraint_mode针对该constraint进行关闭。
- 最简便的方法是通过static变量,记录上一次随机的值,下一次照常随机,然后再用static值去覆盖。
Additional tracking
只要调用class的randomize(),vcs就会检查class内定义的所有constraint合法性。ex:即使你用的是inst_A.randomize(item_a)去随便某个item,看起来和其它item没有什么关系,但结果是会检查所有constraint,如果有某个item的default或assign的值没有在constraint里面,就会报错。
sv-2012提供了软约束的功能,可以很好解决base constraint与其它额外约束之间的冲突