//需要随机化的情况
器件配置
环境配置
原始输入数据
延时
协议异常
实现方式
rand(抓完放回)/randc(抓完不放回)进行随机,通过constraint {}约束块
分类
按{}中的内容分为:范围、权重、条件约束
范围
布尔表达式
lo<x;
x<hi;//(大于小于要分开写,lo<x<hi是不允许的)
范围表达式
c inside{[lo:hi]};//lo<=c && c<=hi
!(c inside{[lo:hi]});//c<lo or c>hi
//$指定上下限
rand bit[6:0]b;
constraint c_range
{
b inside{[$:4],[20,$]};//0<=b<=4 || 20<=b<=127
}
//使用数组
rand bit[6:0]b;
int fib[5]='{1,5,3,9,2};
constraint c_range
{
b inside{fib};//b取1,5,3,9,2
}
权重
权重分配
变量名 dist{0:=40,[1:3]=60};
//权重相等,变量=0,weight=40/220;变量=1,weight=60/220
变量名 dist{0:/40,[1:3]/60};
//均分权重,变量=0,weight=40/100;变量=1,weight=20/100
带变量的权重分配
typedef enum {A, B, C} r;
class R;
rand r;
int a=1, b=1, c=1;
constraint c
{{
A := a, B := b, C := c
};}
endclass
条件
constraint c_stim
{
if (flag)
{
dst inside {[40:80]};
}// if后多个语句不用begin_end,用{}
else
dst inside {[2:10], [50:67]};
}
constraint c_stim
{
flag -> dst inside {[40:80]};
!flag -> dst inside {[2:10], [50:67]};
}//条件语句和执行语句是同时随机的
外部约束
对某一变量采用不同约束
class Packet;
rand bit [7:0] length;
rand bit [7:0] payload[];
constraint c_valid {length > 0;payload.size() == length;}
constraint c_external;
endclass
constraint Packet::c_external {length == 1;} //在类外定义
双向约束
约束块不像自上而下执行的程序性代码,为声明性的代码,是并行执行的;所有的
约束表达式同时有效,取交集
rand logic [15:0] r,s,t;
constraint c_bitir {
r < t;
s == r;
t <30;
s >25;
}