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中约束https://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;