SV 随机化(Randomization)
- Coverage Driver Verification
- 可约束的随机化验证,用于测试的值可以再一定范围内进行随机,具体的范围可以进行约束,比如可以跑100次,然后查看覆盖率,可以通过覆盖率进行度量验证的进度
内容
- 随机化的变量往往需要添加一定的约束,通过添加约束让值在一定的范围内进行随机
随机化验证策略
- 首先先验证一些正常的testcase
- 验证一些异常的值
- 验证一些边界值
- 定向测试:测试的值都是定死的,debug的时候可以使用定向测试,定向测试不能检查一些隐形的错误
- 随机测试:测试的值都是随机的,随机化验证策略可以检测设计中的不可预期的错误和隐形的错误
随机内容有哪些
- 容错处理,给出一定超出规定范围的值,看DUT是不是能够进行处理
SystemVerilog的随机化
- 验证组件的基本单元都是class,所以在class中进行随机化
class Bus
rand bit[15:0] addr;
randc bit[31:0] data;
constraint range1{
addr > 1024;
addr <16384;
};
endclass
- 同一个随机种子下随机数的值是一样的
随机化的约束
data inside {[1001,9999]}
随机化的约束:权重分布
随机化约束:双向约束
随机化约束:条件约束
随机化约束的结果的可能性
- 上面的约束条件是并行执行的
- solve y before x - 先找y的取值再找x的取值
随机化约束:foreach
![]
(https://img2024.cnblogs.com/blog/3077491/202401/3077491-20240123224529767-2039412941.png)
- foreach - 对于数组中每个元素进行随机约束
随机化约束:function
随机化约束:约束保护
激活或者关闭随机变量
练习
补充知识
pre_randomize and post_randomize
- 在调用randomize的时候同时会调用pre_randomize和post_randomize
- 先执行pre_randomize,再指向randomize,再执行post_randomize,调用randomize函数的时候,会调用三个函数
with
std::randomize()
$urandom
$urandom_range
- 相同种子下的随机数是一样的