SV基础之随机化(一) 随机变量和约束背景根据绿皮书第6章内容进行整理核心内容随机变量约束权重我的理解随机变量如果想要一个变量可以进行随机那就需要在变量名前添加rand或者randc修饰符。用这两个修饰符修饰的变量会在其所在对象显示调用randomize的时候进行随机。rand和randc的差别在于randc会在变量取值范围内构建一个排列每调用一次randomize()就返回排列中的下一个值直至所有值都恰好出现一次然后开始新的排列周期。而rand则是随机取值。约束很多时候我们并不希望变量进行完全随机而是在特定范围内进行随机这时候我们就会用到约束。我们通常会将约束放在约束块里。constraint c_stim { len 1000; len 0; if (congestion_test) { dst inside {[CONGEST_ADDR-100:CONGEST_ADDR100]}; srcCONGEST_ADDR; } }这是绿皮书上的一个约束块例子。我们可以看到约束块里面并不支持0len1000这种连续使用两个关系操作符的写法原因是因为如果使用连续关系操作符实际上是分割成了两个表达式((0len)1000)所以最终的约束结果会和你所期望的大相径庭。约束块中也支持if条件语句但是不使用begin...end而是用{}框起来。权重使用dist操作符来修改权重分布权重的分布有两种符号:和:/。:范围内所有值使用相等权重总权重为所有权重累加src dist {0:40, [1:3]:60};上面这个例子的总权重就是403*60220其中0的概率是40/220123的概率都是60/220。:/范围内所有值平分权重总权重为操作符后所写权重总和dst dist {0:/40, [1:3]:/60};上面这个例子的总权重是4060100其中0的概率是40/100123的概率都是20/100。实战要点工作中可以这么用通过添加约束可以提高随机的效率和有效性容易踩的坑在约束块中不要使用begin...end不然编译会报错一句话总结使用随机变量并用约束和权重进行组合约束可以提高随机的效率。