打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何从零开始构建一个可用的UVM验证平台
userphoto

2016.02.21

关注
上一节讲的实际都是随机变量的各种内置函数,constraint本身的定义也有很多方式,现在就常用的主义解释。

inside

这里是为某个变量设定一个取值范围的集合,这对受控随机数的产生很有用。
constraint c { //声明一个约束条件
      // 定义src只能取以下几个数
      src_port inside { [8'h0:8'hA],8'h14,8'h18 };
      //  定义des不能取以下几个数
       ! (des_port inside { [8'h4:8'hFF] });
    }

dist

这里是为某个变量设定每个取值设定分布概率。

   rand bit [15:0] length;
    constraintlen {
     length dist { //对length的取值分布做约束
       [64  :  127 ] :=10,  //此段占比1/4
       [128 :  511 ] := 10,
       [512 :  2048] := 20 //此段占比2/4
     };
   }   

unique
这是可以使得集合中的各变量的数值是互斥的
rand byte a
;
rand byte b;
rand byte excluded;
constraint u { unique{b, a[2:3], excluded}; }
//b a2 a3 excluded分别取不同的值


Implication
蕴含操作,表示当条件满足,则触发之后的表达式

bit[3:0] a, b;
constraint c { (a == 0) -> (b == 1); } 当随机数a取0则b取1


foreach

对所有符合条件的数进行遍历

class C;
rand int A[] ;
constraint c1 { A.size inside{[1:10]}; } //定义数组长度范围
constraint c2 { foreach( A[ k ] ) (k < a.size="" -="" 1)="" -=""> A[k +1] > A
; }
//对所有的数组元素,数值都是递增的
endclass

solve  before

对不同的约束的优先顺序进行划定

    rand bitzero;
    rand bit[15:0] data [];
 
    constraintframe_sizes {
     solve zero before data.size; //先随机化zero,也就是有一半的几率使得data长度是0
     zero -> data.size == 0; //zero决定后,决定data长度
     data.size inside {[0:10]};  //长度范围
     foreach (data
)
       data
== i;

    }


static
如果一个约束定义为static类型,则跟一个变量被定义为static类型类似,对这个约束的开关控制可以控制所有
例化对象中此约束的是否生效。


soft

一般的约束可以认为是硬约束,如果不能被满足则会使仿真器报错。但是验证平台中的组件层次很复杂,为了方便各层级的复用,可以定义软约束,使此种约束尽量被满足,但是即使不满足,也不会报错。

class Packet;
rand int length;
constraint deflt { soft length inside{32,1024}; } //尽量被满足的约束
endclass

Packet p = new();
p.randomize() with{ length == 1512;}    //此处跟软约束冲突,满足此处的约束,放弃软约束。

对于软约束,他被执行的优先级有明确的规定,大致遵循以下规则。

1、         写在类中后边的约束优先级高于前面

2、         定义在结构外的约束优先级高于里面

3、         派生类中约束优先级高于父类

4、         后例化的实体中约束优先级高于前面

同时,所有软约束的优先级都低于硬约束,而且可以通过disable来取消它


randcase

通过概率分布来定义的选项,概率表达式可以是任何变量
byte a, b;
randcase
a + b : x = 1;  //取值1的概率是 a+b
a - b : x = 2;
12'b800 : x = 4;
endcase



randsequence
这个用来产生一个带有随机顺序配置的序列操作,可以类比assertion中的sequence

initial
begin
 
repeat(6000)

randsequence( main )
main : first second done ;  //定义main由三个步骤组成
first : add | dec ;  //步骤1可以选择加减中的一个
second : pop | push ; //步骤2可以选择进出栈中的一个
done : { $display('done'); } ;
add : { $display('add'); } ;
dec : { $display('dec'); } ;
pop : { $display('pop'); } ;
push : { $display('push'); } ;
endsequence

end

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言指针数组和数组指针
Allegro线长约束设置
在Oracle9i中定义视图约束
oracle约束简单总结
SQL Server缺省约束 列约束和表约束
[学习笔记] Oracle字段类型、建表语句、添加约束
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服