更多内容请关注下面公众号!
硅芯思见
本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通!
在SystemVerilog中,约束一般分为两种:一种称之为“硬约束hard constraint”,这种也是我们经常使用到的约束方式,还有另外一种称之为“软约束soft constraint”,那么这个“软约束”是如何使用产生约束呢?本文将通过示例说明“软约束”的使用方法和注意事项。
“软约束”之所以“软”主要是因为“软约束”提供给了用户更多的自适应性,用户可以通过各种其他约束方式实现对于“软约束”的各种蹂躏。一般情况下,用户使用“软约束”实现默认约束的设置,当有新的约束或者更高优先级的约束时,尽管此时新的约束可能与“软约束”设置约束冲突,但是也不会产生任何warning,但是同样的约束冲突对于“硬约束”是无法忍受的,如下例。
【示例】“硬约束”约束冲突
【仿真结果】
示例中采用的是“硬约束”,因为定义在类中的约束与随机时指定的内嵌约束“矛盾”,所以导致约束解析器解析随机失败,即“硬约束”要求所有相关的约束条件不能互相矛盾,否则将会随机失败。同样的示例,如果我们采用“软约束”结果就不一样了,如下例。
【示例】
【仿真结果】
从仿真结果可以看到,在类中对变量dat_length进行约束时通过关键字“soft”指定当前约束为“软约束”,前类的对象随机时指定内嵌约束进行约束时,原来在类中通过“soft”指定的随机约束会被随机时指定的内嵌约束overriden,所以最终的随机结果dat_length为64,并且解析器也不会产生error或者warning。
除了上例这种“软约束”与“硬约束”交叉使用以外,在SystemVerilog中约束可以设置的方式很多,并且会存在各种约束比“软硬”的情况,为此,下面我们将通过各种交叉使用情况学习“软约束”到底有多“软”。
【示例】类中使用“软约束”,随机时使用内嵌“软约束”
【仿真结果】
从仿真结果可以看到,类中使用约束块定义了“软约束”,在对象随机时通过内嵌约束又指定了新的“软约束”,并且两处“软约束”并无交集,但是仿真结果中原有类中定义的约束块并没有起作用,起作用的是对象随机时指定的“软约束”,即内嵌约束中的“软约束”优先级高于类中约束块中定义的“软约束”,其取值范围可示意为下图。
【示例】类中使用“硬约束”,随机时使用内嵌“软约束”,并且约束无交集
【仿真结果】
示例中,类中约束块中采用了“硬约束”,对象随机内嵌约束中使用了“软约束”,并且“软约束”与“硬约束”无交集,从仿真结果可以看出,虽然内嵌约束在使用顺序上晚于“硬约束”,但是此时“软约束”并没有起作用,即“软约束”优先级低于“硬约束”,其取值范围可示意为下图。
【示例】类中使用“硬约束”,随机时使用内嵌“软约束”,并且约束有交集
【仿真结果】
示例中,当“硬约束”和“软约束”同时有效时,此时进行随机的数值范围为“硬约束”和“软约束”的交集,其取值范围可示意为下图。
通过上述几个示例,可以看到当同时存在“硬约束”和“软约束”时,“硬约束”的优先级更高,并且形成了对于“软约束”的碾压。当“硬约束”和“软约束”有交集时去两者交集,当“硬约束”和“软约束”无交集时,“硬约束”有效,“软约束”无效。上述示例是“硬约束”和“软约束”之间的关系,那么要是存在一堆“软约束”时,到底哪个约束或者哪几个约束会起作用呢?我们看下面的示例。
【示例】同一个类中存在多个“软约束”,且约束集无交集
【仿真结果】
示例中,在packet的内部定义了两个约束块,并且两个约束块没有交集,此时最终的仿真结果可以看出来取值范围受第二个约束块约束,即在相同的作用域内,如果有多个“软约束”,且约束块无交集时,那么最后一个“软约束”具有最高优先级,起决定作用,其取值范围可示意为下图。
【示例】同一个类中存在多个“软约束”,且约束集有交集
【仿真结果】
示例中,在packet的内部定义了两个约束块,并且两个约束块有交集,此时最终的仿真结果可以看出来取值范围受二个约束块的交集约束,即在相同的作用域内,且约束块有交集时,那么取值范围由两个“软约束”的交集决定,其取值范围可示意为下图。
因为内嵌约束实际上相当于类本身的拓展约束,所以如果类本身和内嵌约束都是用了“软约束”时,其作用效果也分为两种情况,第一种是有交集,此时随机变量的最终约束范围由多个约束块的交集决定;第二种是无交集,此时随机变量的最终约束范围由最后一次定义的“软约束”决定,即由内嵌约束快中的“软约束”决定。
上述示例都是针对SystemVerilog内嵌的数据类型进行定义的,如果随机变量使用户定义的类呢?请看下面示例。
【示例】
【仿真结果】
示例中,A和B都对其中元素进行了“软约束”,在C中对于A和B的两个句柄指向对象的元素再次进行“软约束”,当Cobj指向的对象在随机化时,此时Aobj和Bobj指向对象中的元素不受类A和B中定义的约束块中“软约束”影响,此时Aobj和Bobj仅受其所在类中约束块的影响,即类中对于其元素的“软约束”的优先级高于元素本身定义时指定的“软约束”。但是如果A和B本身对于其中元素采用的是“硬约束”,那么此时C中的“软约束”也将给“硬约束”让路。
通过上述的示例,soft约束在某种程度上提供了对于随机变量的默认约束,当有其他约束存在时,soft约束将会按照一定的优先级规律受到影响,甚至被overriden,具体可以总结如下:
-
“软约束”可以用于设置默认约束,并且同一个类中的多个“软约束”之间可以没有交集;
-
同一个类中对于某个随机变量的多个“软约束”,如果这些约束没有交集,那么最终有效的是将是距离调用randomize()最近的“软约束”;
-
类中使用“软约束”,随机时使用了内嵌“软约束”,内嵌约束的优先级高于类中定义时指定的“软约束”;
-
某个随机变量的“软约束”优先级低于其“硬约束”;
-
当“硬约束”和“软约束”同时有效时且有交集,此时进行随机的数值范围为“硬约束”和“软约束”交集;
-
在父类和子类中对于某个随机变量都进行了约束,则子类约束优先级高于父类中的优先级;
-
当A类作为B类的成员,那么A类中的“软约束”优先级低于B中“软约束”;
综上所述,“软约束”可用于设置默认约束,优先级低于“硬约束”,同样的“软约束”又根据其编写和调用的顺序优先级逐渐提高,最底层的“软约束”最“软”,整个约束的关系如下图所示。