数字验证学习笔记——SystemVerilog芯片验证16 ——约束控制块&随机函数

一、约束块控制

  • 一个类可以包含多个约束块。可以把不同约束块用于不同测试。
  • 一般情况下,各个约束块之间的约束内容是互相协调不违背的,因此通过随机函数产生随机数时可以找到合适的解
    如果子类继承父类,也继承了父类的约束,这个时候如果在子类里约束,不能违背父类里面的约束。
  • 对于其他情况,例如根据不同需求,来选择使能那些约束块,禁止那些约束块的要求,可以使用内建的constraint_mode()函数打开或者关闭约束。

1.1 打开或关闭约束块

在这里插入图片描述
声明句柄p,创建p=new(); 此时 length=0;
p.c_short.constraint_mode(0); //关闭 c_short 约束
p.constraint_mode(0); //关闭 P里面所有的约束
p.c_short.constraint_mode(1); //打开 c_short 约束

1.2 内嵌约束

  • SV允许使用 randomize()with 来增加额外的约束,这和在类里增加约束是等效的,但同时要注意
    类内部约束和外部约束之间应该是协调的,如果出现互相违背的情况,那么随机数值求解会失败。
    在这里插入图片描述
    t.randomize() with { addr inside [200:300] ; data inside [10:20] ; }
    soft 表示 soft定义的约束和别的约束冲突时,soft 的约束 优先级更低。

二、随机函数

2.1 pre_randomize() 和 post_randomize()

  • 有时候在调用randomize() 之前或者之后立即执行一些操作,例如在随机前设置类例的一些非随机变量(上下限,条件值、权值)
  • SV提供了两个预定义的void 类型函数pre_randomize()和post_randomize()函数。用户可以在类中定义这两个函数,分别在其中定义随机化前的行为和随机化后的行为。
  • 如果在某个类中定义了pre_randomize()或者post_randomize()函数,那么对象在执行了randomize()之前或者之后会分别执行这两个函数。所以,pre_randomize()和post_randomize()可以看做是randomize()函数的回调函数(callback function)。

2.2 $random() $urandom() $urandom_range

  • $random() 平均分布,返回32位有符号随机数
  • $urandom()平均分布,返回32位无符号随机数
  • $urandom_range() 在指定范围内的平均分布
    $urandom_range(A,B) 产生一个在A,B里面的数

2.3 随机化个别变量

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值