当前位置: 代码迷 >> 综合 >> Systemverilog 第十课 随机化
  详细解决方案

Systemverilog 第十课 随机化

热度:35   发布时间:2023-12-18 22:40:38.0

第十课 Randomization

Randomization

  • 关键词:rand
rand[7:0] y;

y会在0~255之间随机生成。

  • 关键词:randc
randc[1:0] y;

y会在0~3之间随机生成,并且必定以四个为循环生成互不相同的数字,只能对bit 或enum类型使用这个关键词。

  • 关键字:constraint
    在这里插入图片描述
    对于声明过rand/randc的变量可以使用constraint限定
  • randomize()函数
    在这里插入图片描述
    randomize属于内嵌的系统函数 ,函数会给所有object里的随机变量赋予新值。
    randomize函数本身在成功时返回1,失败时返回0。
  • constraint solver
    输入同样的seed可以得到同样的随机结果,用于复现

Constraint 约束

随机变量的约束都包含在constraint函数模块当中:
在这里插入图片描述
如上图所示,constraint为关键字,range1是约束集的名字,大括号内是约束模块。
每一句约束只能含有一个操作符,多个约束必须要写多句程序。
在这里插入图片描述

  • 关键词:inside
    可以设置区间约束,用 ! 取补集
    在这里插入图片描述
    练习:
    在这里插入图片描述
    从例题中可以看出inside可以当做小于等于号
  • dist操作符
    可以给随机变量赋权重,使用:=或者:/符号,:=表示赋的就是当前权值,:/表示平分权值。
    在这里插入图片描述
    在这里插入图片描述
    ***约束都是并行的,同时判定。
  • 条件约束->
    在约束模块中用->代替if/else语句:
mode == small -> len<10;
mode == large -> len>100;

但是判定的瞬间是同时进行的,不会受语句先后的影响。

  • solve…before
    会先约束solve和before之间的变量,并且会对随机结果产生不同的影响。
    例子:
    在这里插入图片描述
    在这里插入图片描述
    注意两种情况的概率差别

  • Iterative constraint迭代约束
    给数组添加约束时,可以用foreach语句迭代约束

  • function constraint函数约束
    用函数关系表示约束

class B;
rand int x,y;
constraint C{x<=F(y);}
constraint D{y inside {2,4,8};}

此时y会被强制在x之前判定。

  • 变量保护
    在这里插入图片描述

Disabling Random Variables

  • rand_mode()
    属于不能改写的内嵌系统方法,能用来打开和关闭随机变量
    在这里插入图片描述
  • constraint_mode()
    在这里插入图片描述