近期看到一种关于约束的复用方法,总结分享如下。
在不同的用例中,随机参数的随机约束不会完全一致,最典型的就是错误或者异常用例的非法取值约束。对于这种不同的约束,常见的处理办法就是继承,并重写原有参数的约束,如下所示。
class item;rand bit[3:0] a;constraint c{ a > 0;}//....endclassclass abnormal_item;constraint c{ a == 0;//覆盖原有的a>0约束}//....endclass
除了存在可能的过度继承问题,继承方式是一种静态的is-a关系,一旦abnormal_item确定后,参数的约束就已确定,不具备动态添加或者删除约束的能力。
到这里,提一下decorator pattern(装饰者模式)。decorator pattern大致是一种这样的思路:
在decorator pattern的结构中,可以动态地给一个对象添加新的功能,同时又不改变其结构,将对象的行为分为核心功能和可选功能。核心功能指对象最基本的职责,而可选功能则是在不改变核心职责的情况下增加的功能。通过使用装饰者模式,可以动态地将可选功能装饰在核心功能之上,使对象的功能更加灵活......
借鉴类似的思路,可以将随机参数和其约束分离开来,将随机约束视作对原参数的装饰,进而达到动态、可复用随机约束的目的。
一个实例的类图结构如下:
在这种结构下,大致分为两层:
第一层是包含随机参数的激励定义层,item仅包含随机参数的声明,不包含参数的约束内容。constrainted_item继承于item,不包含直接的参数约束,而是通过add_instance_cons方法,动态的添加对随机参数的约束。
第二层是约束实现层,抽象类abstract_constraint仅包含item类,不实现对tem参数的具体约束,不同的约束由可重用的子类实现,即图中的reusable_cons实现。
相关参考代码如下。
随机参数定义:
class item; rand int val;endclassclass constrained_item extends item; `constraints_utils(item)endclass
抽象和约束实现定义:
virtual class abstract_constraint #(type t = int); protected t object; function void set_object(t object); this.object = object; endfunctionendclassclass only_even_values extends abstract_constraint #(item); constraint c { object.val % 2 == 0; }endclass
动态添加约束和随机:
initial begin automatic constrained_item i = new(); automatic only_even_values only_even = new(); i.add_instance_constraint(only_even); repeat (100) begin if (!i.randomize()) $fatal(0, randomization failure); //.... endend
上述的constraints_utils实现代码如下:
`define constraints_utils(type) ... local rand constraints::abstract_constraint #(type) instance_constraints[$]; function void add_instance_constraint(constraints::abstract_constraint #(type) c); constraints::abstract_constraint #(type) c_copy = new c; c_copy.set_object(this); instance_constraints.push_back(c_copy); endfunction ...
可以看到,constrained_item内部包含了一个rand类型的instance_constraints队列,用于存储分离约束的句柄。同时only_even_values内也包含了指向constrained_item的句柄。当constrained_item进行randomize时,instance_constraints队列也会随机,在only_even_values内完成对constrained_item的参数约束。
如何进行arduino控制的呼叫并发送短信
mcu多少位是什么意思 8位mcu怎么干扰 单片机干扰怎么解
详谈LED光源的光学设计
苹果iphone8:全面屏+颜值逆天+无线充电
mm32-2nd-bootloader配置软硬件环境
一种可重用constraint的实现方法
华为P10和华为P9有什么区别?华为P10和华为P9评测对比
手机主板上的元件介绍
内存不够用,iOS10.3 来啦,瞬间释放你的爱机!
华硕破晓PX574拆解 做工怎么样
一文告诉你为什么你的手机内存卡,比标称值要小
航拍无人机十大排行榜_航拍无人机推荐
多通道同步数据采集卡PXI-2020/2022系列
F3-FHRH人脸识别红外测温一体机可读健康码,主打高效防疫
你了解ADC吗?模数转换器(ADC)不同类型数字输出深解
荣耀10i曝光搭载麒麟710处理器和水滴屏设计拥有三个配色
解锁电机应用创新方案 无感FOC控制算法备受瞩目
I-PEX连接器应用于Clockwork开源设备
华为感恩回馈季即将启幕 给你入手华为R1 Pro的5大理由
大数据技术的主要挑战及解决方法