SV基础之随机化(三)
随机化控制内嵌约束与模式开关背景根据绿皮书第六章内容总结核心内容内嵌约束动态开关随机函数我的理解内嵌约束任何类都有一个内嵌函数.randomize()在调用的时候可以在后面追加with { ... }内嵌约束块内嵌约束与对象原有约束取交集仅对当次随机化生效。内嵌约束是临时附加限制的最直接方式避免了派生新类或开关约束使测试序列编写非常灵活。在UVM验证环境中当驱动transaction或者sequence的时候经常会使用这种约束方法避免在sequence中使用约束块使sequence可随机范围变小。动态开关variable.rand_mode(0)可将某个rand变量临时转为非随机使其保持当前值不变rand_mode(1)恢复随机。constraint_block.constraint_mode(0)可关闭某个命名约束块obj.constraint_mode(0)关闭所有约束块。这些方法均返回原状态方便保存恢复。动态开关允许同一对象在不同阶段呈现不同随机行为如在配置阶段随机化地址而在数据传输阶段仅随机化数据而地址固定极大增强了重用。随机数函数绿皮书6.10节介绍了一些常用的随机函数$random—— 平均分布返回32位有符号随机数$urandom—— 平均分布返回32位无符号随机数$urandom_range(max, min)—— 在指定范围内的平均分布返回指定范围内的有符号整数若省略min则默认为0max和min的位置可以调换取值范围不变。后面还介绍了一些$dist开头的随机函数但是我从来没有用过暂时跳过不介绍。