随机化验证是UVM SystemVerilog的核心,但随着验证环境越来越复杂,随机化的性能问题逐渐成为瓶颈。本文分享一些实战技巧,帮你优化约束代码的运行速度,同时提升代码的可维护性。
一、性能优化:让随机化跑得更快
1. 用solve...before
指定变量顺序
SystemVerilog的约束默认是双向且同时求解的,但某些场景下变量之间有明显的依赖关系。例如,先确定“模式(mode)”,再根据模式确定“数据宽度(data_width)”。这时可以用solve...before
手动指定求解顺序:
constraint mode_order {
solve mode before data_width;
solve data_width before min_value, max_value;
}
这样做能减少求解器的计算路径,但要注意两点:
- 可能改变分布:变量顺序调整后,随机分布可能不再均匀,必要时用
dist
约束调整。
2. 警惕foreach
的隐藏成本
用foreach
遍历数组很方便,但每一条约束都会转化为多个独立约束。比如下面这段代码会生成100个变量和99条约束(每个元素必须大于前一个):
rand bit [31:0] data[100];
constraint data_order {
forea