当前位置:   article > 正文

system verilog(六)随机化_system verilog 随机延时

system verilog 随机延时

定向测试集能够找到你认为可能存在的bug;而使用受约束的随机测试法(CRT)自动产生测试集,可以找到你都无法确定的bug
简单的定向测试集只需施加激励,然后人工检查输出结果(保存为标准日志文件.log文件),用来和今后的仿真结果进行比较,以判断仿真结果的正确性;CRT不仅需要产生激励,还需要通过参考模型、传输函数或其他方法预测输出结果。
(CRT由两部分组成:使用随机的数据流为DUT产生输入的测试代码;伪随机数发生器种子,只要改变种子的值,就可以改变CRT的行为)

什么需要随机化:
1、器件配置(随着时间的变化,DUT的配置越来越随机)
2、环境配置(器件在一个包含若干个期间的环境里工作,应该随机化整个环境,包括对象的数量和它们如何配置)
3、原始输入数据($random)
4、封装后的输入数据(需要处理激励的不同层次)
5、协议异常、错误和违规(测试平台应该能够产生正确的激励,然后通过翻转某一个配置位,在随机的时间间隔里产生随机的错误类型)
6、延时(测试平台应该在每一个测试里都使用随机的、有效的延时,以便发现设计中的bug;例如在周期级验证更低的级别,对时钟抖动很敏感,通过将时钟沿来回移动很小的步长,可以检查设计对时钟周期是否异常敏感;而时钟发生器位于测试平台之外,这样可以在有效区域active region 产生事件;但测试平台不应违反建立时间和保持时间的约束)

首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值,可以用约束来限制这些随机值的范围,使他们是有效的值。

class packet;
rand bit[31:0]src,dst,data[8];//使用rand修饰符,表示每次随机化这个类时,都会随机赋值
randc bit[7:0] kind;//randc类型,表示周期随机性,所有可能的值都赋值过随机值才可能重复
//约束
constraint c {src>10;src<15;}//约束是一组确定变量值范围的关系表达式,永远为真
endclass

packet p;
intial
begin
p=new();//产生一个包
assert(p.randomize());//使用断言来检查randomize函数的结果
else
$fatal (0,"packet::randomize failed");
transmit(p);
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

不能再类的构造函数里随机化对象,因为在随机化前可能需要打开或关闭约束、改变权重,添加新的约束;构造函数用来初始化对象的变量,不能再这里调用randomize()函数;类中所有变量应该是随机的公有的,这样测试平台才能最大程度控制DUT。
当代码中有矛盾的约束,随机化过程就会失败,即assert检查randomize函数返回值,若返回0,断言检查到错误后会显示错误信息。

system verilog只能随机化2值数据类型,但位可以是2值或4值类型;可以使用整数和位矢量,但不能使用随机字符串,或在约束中指向句柄。

每个表达式里至少有一个变量是rand或randc类型的随机变量;否则类会在随机化时出错,除非正好满足约束条件,此时约束条件只是检查非随机变量是否有效。

简单表达式(在一个表达式中最多只能使用一个关系操作符(<、<=、==、>=、>)
例如:

class orde
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/107105
    推荐阅读
    相关标签
      

    闽ICP备14008679号