目录
pre_randomize()和post_randomize()
1 随机约束和分布
为什么需要随机和约束
随着芯片体积的增大,复杂度日益提高,定向测试已无法满足验证的需求,随机测试的比例逐渐提高。定向测试只能找到你认为可能存在的缺陷,而随机测试可以找到连你都没有想到的缺陷。
若只有随机没有约束,那么会产生很多无效和非法的激励。随机的对象不只是一个数据,而是有联系的变量集。通常这些变量会封装在一个数据类中,同时需要在类中声明数据之间的约束关系。约束不但可以指定数据的取值范围,还可以指定数据的随机权重分布。
随机的内容
- 器件配置:寄存器和系统信号
- 环境配置:随机化验证环境
- 原始输入数据:例如MCDF数据包的长度、宽度、数据间的顺序
- 延时:握手信号之间的时序关系,例如valid和ready、req和ack之间
- 协议异常:例如反馈信号给出异常,那么设计能否保持后续数据处理的稳定性
声明随机变量的类
一般情况下,我们倾向于将需要产生随机化的相关数据整理在一个类中,同时用rand关键词来表明该变量的随机属性,randc为周期随机性。
【rand和randc区别】:rand为普通随机,表示每次随机化这个类时,这些变量都会赋一个值(类似抽签,抽完放回去继续抽);randc修饰符,表示周期随机性,即所有可能的值赋过值后随机值才可能重复(类似抽签,抽完不放回继续抽)。
随机属性还需配合randomize()函数使用,即只有通过声明rand变量,并且在后期通过对象调用randomize()函数才可以随机化变量。约束constraint也同随机变量一起在类中声明。
实例说明:
//SV绿皮书
//例6.1简单的随机类
class packet;
//随机变量,rand普通随机
rand bit [31:0] src, dst, data[8];
//randc周期性随机变量
randc bit [7:0] kind;
//src的约束,表示随机时src介于10和15之间
//如果不加约束,src每个数据出现的概率为1/256
constraint c {src > 10;src < 15;}
endclass
Packet p;
initial begin
// 创建一个对象
p=new();
//随机化约束一般写在class中,用点的方式去调用
assert (p.randomize());
//用断言检查随机化,随机化成功,函数返回1;失败返回0.
//randomize成功的条件是所有的随机变量随机成功
else $fatal(0,“Packet::randomize failed”);
//随机化失败,函数返回0,并显示错误信息
transmit (p);
end
【约束constraint的细节】:
1 约束表达式的求解是由SV的约束求解器完成,满足约束的值是由**伪随机数发生器(PRNG)**从一个初始值(seed)产生,只要改变种子的值,就可改变随机的行为。
2