1.概述
- 随着设计变得越来越大,要产生一个完整的激励来测试设计的功能也变得越来越困难
- 定向激励的测试方法已经无法满足检查功能完整性的要求
- SOC的集成度提高带来的模块之间交互的复杂度也是指数攀升,这就使得验证工程师无法预测接下来用户使用过程中会发生什么样的状态
- 随机—约束,两个词组合在一起就构成了目前动态仿真验证的主流方法
- 随机约束测试(CRT, Constrained-Random Test)即能够产生你感兴趣的,你想不到的测试向量,通过回归测试、替换随机种子的方式来提高单位测试用例的覆盖率收集效率
- 随机测试带来的环境复杂度还包括由于对环境复用和测试复用带来的组件封装要求,这会使得代码量加大
- 基于MCDT的SV实验主要目的在于帮助同学建立验证环境结构的概念以及理解测试激励的生成及发送过程
2.如何简单地产生一个随机数?
- 在我们学习如何定义一个“随机”属性类之前,先了解一下如何复用系统函数产生一个随机数
- 通过系统函数std::randomize()对一些变量即可完成随机化,或者理解为产生随机数并赋予这些变量
- $urandom(),可以生成一个32位的无符号随机数
- $urandom_range(maxval,minval=0),可以生成介于maxval与minval之间的数
3. 什么是系统而有机地组织随机变量
- 比起我们独立地生成一些随机数,在向DUT产生随机激励时,为了符合协议、满足测试需求,我们还需要添加一些约束
- 这些约束会使得变量朝着希望他们变化的方向去随机
- 这些约束也会对变量与变量之间的关系生效
- 我们需要一个载体去容纳这些变量以及它们之间的约束
- 这个载体即是类,而类的成员变量均可声明为“随机”属性,用rand或者randc来表示
4. 随机变量
- 任何类中的整形(bit/byte/int)变量都可以声明为rand/randc
- 定长数组、动态数组、关联数组和队列都可以声明为rand/randc,可以对动态数组和队列的长度加以约束
- 指向对象的句柄成员,也可以声明为rand(不能被声明为randc),随机时该句柄指向对象中的随机变量也会一并被随机
5. 修饰符rand和randc
- 对于rand修饰符,表示在可生成的范围内,每个仁的可能性是相同的
rand bit[7:0] y; - 对于randc修饰符,它的值将会随机并且遍历其可聚会范围
randc bit[1:0] y;