硅芯思见:“软约束”到底有多“软”

更多内容请关注下面公众号!

硅芯思见

本文纯属学习之用,欢迎指正文中不足,封面图片若有侵权,请及时沟通!

在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中“软约束”;

综上所述,“软约束”可用于设置默认约束,优先级低于“硬约束”,同样的“软约束”又根据其编写和调用的顺序优先级逐渐提高,最底层的“软约束”最“软”,整个约束的关系如下图所示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硅芯思见

你的鼓励是我创作的最大源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值