OOP-Randomization(面向对象-随机化)
内容来自启芯-System Verilog视频
==============================================================
目录结构:
1、为什么需要随机?
2、什么时候应用随机化?
--------2.1 基于OOP的随机化
--------2.2 变量约束
--------2.3 控制符
--------2.4 顺序约束
--------2.5 randomize
--------2.6 randsequence
3、总结
==============================================================
本章目标:
1、了解为什么需要在验证中随机化
2、随机变量
3、约束随机变量
1、为什么需要随机?
验证的过程中穷尽所有可能的输入序列将耗费大量的时间,所以穷举法不可用,选取足够让你得到信息的随机化序列,变成了最好的出路。
2、什么时候应用随机化?
图1、验证时间图
2.1 基于OOP的随机化
支持两个类型的随机属性
rand
randc
当类方法randomize()调用时rand和randc起到随机作用。
rand属性可产生任意合法值
randc最大16bit
图2、随机例子
类内定义rand和randc的随机变量
2.2 变量约束
inside:对变量指定范围
size:队列数组,指定大小
图3、约束例子
:=:对所有值进行权重
:/ :平方比重
图4、例子
数组约束
对数组的值进行不同约束可用foreach 循环,size(),sum()等
图5、例子
2.3 控制符
-> :事件操作符
if…else :条件操作符
图6、例子
事件操作符“->”与if…else…相同,满足条件才执行
2.4 顺序约束
randc先于rand执行
solve-before定义执行顺序
图7、solve before例子
如上flag和addr没有生成数据的先后顺序,所以在执行if else 语句就有执行顺序,代码设定先执行flag
2.5 randomize
当randomize()执行时,pre_randomize()先被执行,randomization执行,然后post_randomize()执行。
pre_randomize():在randomization前进行约束设置
post_randomize():在randomization后进行更正
图8、randomize后使用约束例子
控制radomization属性的开关。
task/function itobject_name.property.rand_mode(0|1);
1 = 开
0 = 关
图9、关闭随机变量例子
另外还可对类内的随机变量做选择是否随机。
2.6 randsequence
randsequence():可用于状态机,状态机内又支持if…else…,case break等
3、总结
随机是验证中的关键技术,如何实现随机?随机的使用,随机的约束,本节都有一些讲解。