SV基础知识4----随机化和约束

目录

1 随机约束和分布

为什么需要随机和约束

随机的内容 

声明随机变量的类  

权重分布

集合成员的inside运算符 

条件约束

双向约束   

解的概率 

2 约束块的控制

打开和关闭约束 constraint_mode()   

 内嵌约束 randomize() with{} 

3 随机函数

pre_randomize()和post_randomize()

随机数函数 

随机化个别变量  

4 数组约束

5 随机控制


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

  • 18
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值