数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布

一、随机和约束

1.1 随机

  1. 定向测试能找到你认为可能存在的缺陷,而随机测试可以找到你没有想到的缺陷。
  2. 随机测试相对于定向测试可以减少相当多的代码量,而产生的激励较定向测试也更多样。

1.2 约束

  1. 我们想要的随机自由是一种合法的随机,需要限定激励和合法范围。
  2. 同时,伴随测试的进行,约束甚至应该“变形”,变得更趋于为测试得数值范围或者期待得数值范围。
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第1张图片

二、声明随机变量的类

  • 随机化是为了产生更多的驱动,因此在软件世界“class”一侧的运用更多,所以我们倾向于将相关数据有机整理在一个类的同时,也用rand关键词来表明它们的随机属性。
  • randc表示周期随机性,即所有可能的值都赋过后随机值才能重复。
  • 随机属性需要配合SV预定义的类随机函数std::randomize()使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()函数才可以随机化变量
  • 约束constraint也同随机变量一起在类中声明。
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第2张图片
    p=new() ; 创建对象之后,对象里面的成员变量src、dst等值都为0.
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第3张图片
    一般使用bit 2值数据类型,使用logic也可以,但是无法随机出X值和Z值。
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第4张图片
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第5张图片
    const 就是常数,后面不能在赋值。

2.1 权重分布

  • 关键词dist可以在约束中用来产生随机数值的权重分布,这样某些值得选取机会要比其他值更大一些。
  • dist操作符带有一个值的列表以及相应的权重,中间用** := : / **分开。值或权重可以是常数或者变量。
  • 权重不用百分比表示,权重的和也不必是100。
  • :=操作符表示值范围内的每一个值的权重是相同的:/操作符表示权重要平均分到值范围内的每一值
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第6张图片

2.2 集合成员和inside运算符

  • inside是常见的约束运算符,表示变量应该属于某一个值的集合,除非还存在其他约束,否则随机变量在集合里取值的概率是相等的。集合里也可也使用变量。
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第7张图片
  • 使用“$”指定最大值和最小值
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第8张图片

2.3 条件约束

可以通过->或者if-else来让一个约束表达式在特定时刻有效。
数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第9张图片

(io_space_mode)当满足当前条件时,这个条件值大于0时,addr[31:0] == 1’b1

2.4 双向约束

  • 约束块不像自上而下的程序性代码。它们是声明性的代码,是并行的,所有的约束表示式同时有效。
  • 同时,约束也是双向的,这表示它会同时计算所有的随机变量的约束。增加或删除任何一个变量的约束都会直接或间接影响所有相关的值的选取。
    数字验证学习笔记——SystemVerilog芯片验证15 ——随机约束和分布_第10张图片

你可能感兴趣的:(验证学习,SV,学习)