SV学习笔记之随机化
1.首先 CRT 随机测试法通过随机激励 找到定向测试无法确定的BUG。
2.组成有两部分 1.使用随机的数据流来为DUT产生输入的测试代码。
2.伪随机数发生器的种子。
3.第九章将会用功能覆盖率来确定验证的进度。
$random函数可以产生随机的数据
1.器件配置
2.环境配置
3.原始输入数据
4.封装后的输入数据
5.协议异常错误违规
6.延时
6.3 和OOP使用时 sv的随机激励产生是最有效的
首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值。可以用约束来限制这些随机值的范围,使它门为有效的值,也可以测试某些专用的功能。
受约束的随机激励使在事务级产生的,通常不会一次只产生一个值。
例带有随机变量的简单类
class packet;
//随机变量
rand bit【31:0】 src,dst,data【8】; //每次随机化这个类时 变量都会赋一个值
randc bit[7:0] kind; //周期随机性 所有可能的值都赋值过后随机值才可能重复 像发牌 单一变量的周期性
//src的约束
constraint c{ src>10; src<15;} //约束 只有src 为括号内为真
endclass
packet p;
initial begin
p= new();
assert(p.randomize()); //randomize ()函数在遇到约束方面的问题时会返回0 希望为1 为0时跳到 else
else $fatal(0,"packet::randomize failed");
transmit(p);
end
补充断言 assert 希望括号为真
6.3.2 ranmomize
randomize();函数为类里所有的的rand和randc都赋一次 为1时则代表随机化成功
可以被随机化???
整形的变量 由位构成的变量 不能随机化字符串。
6、4 约束
必须是随机变量才能添加约束。
一个表达式中最多只能有一个关系操作符;
对枚举类型的疑惑 显示类型的转换
转换分为 静态转换 动态转换 $cast 即所谓的显示转换
整形不可以直接赋值给枚举
枚举可以直接赋值给整形
整形赋值给枚举 需要进行动态转换 $cast
右边的值赋值给左边的量。
约束块里只能包含表达式 所以约束块里不能赋值;
权重 DIST
src dist{ 0:=40 ,【1:3】:=60}
:= 是每一个
:/是均分权重;
6.4.5集合(set)成员和inside运算符
inside运算符可以产生一个值的集合
可以用$来代表取值范围内的最大值或最小值(个人觉得花里胡哨没用)
6.4.7 条件约束 双向约束
约束块代码是并行的
6.6 一个类可以控制多个约束快
用constraint_mode()来控制 0关 1 开,
6.8内嵌约束
randomize() with
6.9 pre_randomize post_randomize;
6.10随机化参数
$random() //返回32位有符号整形 int
$urandom()//返回32位无符号整形
$urandom_range() //无符号 范围
$dist_exponential()//指数衰落
$dist_normal()//钟形
$dist_poisson()//钟形
$dist_uniform()平均
6.13数组约束
6.15随机控制