天天看点

System Verilog视频学习笔记(8)- Randomization

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、什么时候应用随机化?

System Verilog视频学习笔记(8)- Randomization

图1、验证时间图

2.1 基于OOP的随机化

支持两个类型的随机属性

rand

randc

当类方法randomize()调用时rand和randc起到随机作用。

rand属性可产生任意合法值

randc最大16bit

System Verilog视频学习笔记(8)- Randomization

图2、随机例子

类内定义rand和randc的随机变量

2.2 变量约束

inside:对变量指定范围

size:队列数组,指定大小

System Verilog视频学习笔记(8)- Randomization

图3、约束例子

:=:对所有值进行权重

:/ :平方比重

System Verilog视频学习笔记(8)- Randomization

图4、例子

数组约束

对数组的值进行不同约束可用foreach 循环,size(),sum()等

System Verilog视频学习笔记(8)- Randomization

图5、例子

2.3 控制符

-> :事件操作符

if…else :条件操作符

System Verilog视频学习笔记(8)- Randomization

图6、例子

事件操作符“->”与if…else…相同,满足条件才执行

2.4 顺序约束

randc先于rand执行

solve-before定义执行顺序

System Verilog视频学习笔记(8)- Randomization

图7、solve before例子

如上flag和addr没有生成数据的先后顺序,所以在执行if  else 语句就有执行顺序,代码设定先执行flag

2.5 randomize

当randomize()执行时,pre_randomize()先被执行,randomization执行,然后post_randomize()执行。

pre_randomize():在randomization前进行约束设置

post_randomize():在randomization后进行更正

System Verilog视频学习笔记(8)- Randomization

图8、randomize后使用约束例子

控制radomization属性的开关。

task/function itobject_name.property.rand_mode(0|1);

1 = 开

0 = 关

System Verilog视频学习笔记(8)- Randomization

图9、关闭随机变量例子

另外还可对类内的随机变量做选择是否随机。

2.6 randsequence

randsequence():可用于状态机,状态机内又支持if…else…,case break等

3、总结

随机是验证中的关键技术,如何实现随机?随机的使用,随机的约束,本节都有一些讲解。