为什么需要随机
1.芯片越来越复杂,定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高。
2.定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你自己都想不到的缺陷。
为什么需要约束
没有约束,产生有效激励的同时也产生了很多无效和非法的激励。
关键字:rand/randc,只能出现在class中,用来修饰成员变量。
rand:每次随机的概率都是一样的,假设随机10次,每次都是1/10。
randc:每做一次随机,总数会减1,假设随机10次,第一次随机盖率是1/10,那么第二次就是1/9 。表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。
class Packet;
//The random variables
rand bit [31:0] src, dst, data[8];
randc bit [7:0] kind;
// Limit the value for src
constraint c {
src > 10;
src < 15;
}
endclass
Packet P;
initial begin
P = new();//Create a packet
assert ( packet.randomize())
else $fatal(0,"Packet::randomize failed");
transmit(p);
end
需要随机的变量有四个,只要其中一个约束有问题,那么所有变量都没有进行随机
例题
class data;
rand bit [2:0] mouth;
rand bit [4:0] day;
rand int year;
constraint c_data {
month inside {[1:12]};
day inside {[1:31]};
year inside {[2010:2030]};
}
endclass
注:inside是常见的约束运算符
解析:对于D明显不满足year在[2010:2030]之间的约束。
对于C,第二行定义month只有三位,所以只能表示0-7,结合约束里面的1-12,所以满足month的条件是1-7,C错。
答案是AB
代码练习
class Stim;
const bit [31:0] CONGEST_ADDR = 42; //定义常量
typedef enum {READ,WRITE,CONTROL} stim_e; //自定义枚举类型
randc stim_e kind; //Enumerated var
rand bit [31:0] len,src,dst; //随机变量
bit congestion_test; //非随机变量
/***************约束*******************/
constraint c_stim{
len < 1000;
len > 0;
if (congestion_test){
dst inside {[CONGEST_ADDR + 100:CONGEST_ADDR - 100]};
src == CONGEST_ADDR;
}
else
src inside {0,[2:10],[100:107]};
}
endclass
关键词:dist。
1)可以用来产生随机数值的权重分布。
2)dist操作符带有一个值得列表以及相应得权重,中间用:=或:/分开。值和权重可以是常数或者变量。下图的范围就是变量lo,hi。
3)权重不是百分比表示,权重的和也不必是100
4):= 和 :/具体使用方法看下面的代码
具体代码:
rand int scr,dst;
constraint c_dist{
src dist {0:=40,[1:3]:=60};// :=的意思是产生40个0,1-3每个数产生60个,共产生220个数
//src = 0,weight(权重) = 40/220
//src = 1,weight(权重) = 60/220
//src = 2,weight(权重) = 60/220
//src = 3,weight(权重) = 60/220
dst dist (0:/40,[1:3]:/60);// :/的意思是0的概率是40%,1-3的概率一共是60%
//dst = 0,weight(权重) = 40/100
//dst = 1,weight(权重) = 20/100
//dst = 2,weight(权重) = 20/100
//dst = 3,weight(权重) = 20/100
}
$的使用方法
可以通过 “->”或者if-else来让一个约束表达式在特定时刻有效。
所有的约束表达式都是并行的(单个约束块里多个约束条件和多个约束块都是并行的),如下面代码所示
rand logic [15:0] r,s,t;
constraint c_bidir{
r < t;
s == r;
t < 30;
s > 25;
}
如果你开始从r < t开始计算,令r=20,t=21,->s == r = 20,t < 30满足,但 s=20不满大于25的要求,所以不是并行计算的。