SV之随机化

1、 约束表达式的求解是由SV的约束求解器完成,满足约束的值是由**伪随机数发生器(PRNG)**从一个初始值(seed)产生,只要改变种子的值,就可改变随机的行为。

2 不同仿真工具对于同一个约束类和种子值求解出的数值可能不同
3 SV只能随机化2值数据类型,也就是不能随机出X值和Z值,也无法随机化字符串(logic也只能随机出0和1)
4 注意定义变量位宽对约束的影响,比如 bit [2:0] month ,只能在0~7中选
SV基础知识4----随机化和约束_持续学习_ing的博客-CSDN博客_sv中约束icon-default.png?t=N7T8https://blog.csdn.net/m0_59670134/article/details/119487209


1、randomize会自动调用pre_randomize和post_randomize;

如果A里面包含了B例化的b,则在对A使用randomize时, 会先调用A的pre/post_randomoize,再调用B里面的pre/post_randomize;即先执行顶层的pre/post_randomize,再执行内部成员的pre/post_randomize;(如果有多个层次,一样是从顶向下执行)

2、约束块的求解是并行进行的,约束块之间会相互影响;

3、对于设置类的成员默认值,一般可以设置一块default约束块:里面的约束都加上soft,即软约束,如果外面randomize with的约束与软约束冲突,不会报错,会选择with的约束作为随机约束的解;


约束范围的取反

assert

        std::randomize   (rand_var)    with {  !(rand_var  inside {[10:20],[60:100]}); } 

);

rand_var的随机范围在inside的集合外面;


类里面定义约束并在方法里面调用:

在一个类里面可以在方法里面随机类的成员(this.randomize(this.mi_var));而且这个随机遵循这个类设置的constraint;

(好处:就是在扩展这个类时,可以增加约束块,基类调用this.randomize();去使用扩展类的约束;实在不行还可以在post_randomize里面去随机;)


调用uvm_do_with(tr,{tr.aa == aa})随机没有起效果;

因为aa和tr.aa同名,导致的;具体参考白皮书P185;

解决办法:1)改一下右边的变量名;2)或者采用:tr.aa == local::aa的方式;


软约束和硬约束有交集,随机会取交集;
base_tr软约束:【0:10】 

extend_tr硬约束:【5:90】

实际随机结果会是:【5:10】

如果extend_tr硬约束:【50:100】;

实际随机结果会是:【50:100】

约束块内可以:disable soft rand_var_a;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值