SystemVerilog验证 测试平台编写指南 第六章 随机化 下

6.11 约束的技巧和技术
6.11.1 使用变量的约束
随机赋值时使用变量设定上限的约束。
例6.33 使用变量设定上限的约束

class bounds;
	rand int size;
	int max_size=100;
	constraint c_size {
		size inside {[1:max_size]};
	}
endclass

通过改变变量max_size的值,可以改变随机变量size的上限。
在dist约束里使用变量可以使能或禁止某些值或范围。
例6.34 带有权重变量的dist约束

typedef enum {READ8, READ16,READ32} read_e;
class ReadCommands;
	rand read_e read_cmd;
	int read8_wt=1, read16_wt=1, read32_wt=1;
	constraint c_read {READ8:=read8_wt,
					   READ16:=read16_wt,
					   READ32:=read32_wt};
	}
endclass

可通过改变read8_wt权重变量的值,来改变约束产生命令的概率。更重要的是,可以通过设置权重为0来禁止某些命令的产生。
6.11.2 使用非随机值
如果一套约束在随机化的过程中已经产生了几乎所有想要的激励向量,但还缺几种激励向量,可以采用先调用randomiz()函数,再把随机变量的值设置为固定的期望值来解决。设定的固定激励值可以违反相关的约束。
如果只有少数几个变量需要修改,可以使用rand_mode()函数来把这些变量设置为非随机变量。
例6.35 用rand_mode()禁止变量的随机化 SV绿皮书P155
p.length.rand_mode(0); //设置包长为非随机值
p.length=42; //设置包长为常数
6.11.3 用约束检查值的有效性
在随机化一个对象并改变它的变量的值后,可以通过检查值是否遵守约束来检查对象是否仍然有效。在调用handle.randomize(null)函数时,System Verilog会把所有的变量当作非随机变量,仅仅检查这些变量是否满足约束条件。
6.11.4 随机化个别变量
调用randomize()函数时只传递变量的一个子集,就只会随机化类里的几个变量。
6.11.5 打开或关闭约束
使用条件操作符(->或if-else)来构建由非随机变量控制的约束。
更常见的方法是对每一种指令建立一套独立的约束,在使用时关闭其他所有的约束。
6.11.6 在测试过程中使用内嵌约束
6.11.7 在测试过程中使用外部约束
可以在一个文件里定义类,这个类只有一个空的约束,然后在每个不同的测试里定义这个约束的不同版本以产生不同的激励。

6.12 随机化的常见错误
6.12.1 小心使用有符号变量
除非必要,不要在随机约束里使用有符号类型。
6.12.2 提高求解器性能的技巧
避免使用复杂的运算,例如除法、乘法和取模。

6.13 迭代和数组约束
6.14 产生原子激励和场景

如何产生随机的事务序列?
随机序列randsequence
随机对象数组
6.15 随机控制
6.16 随机数发生器
6.17 随机器件配置
6.18 结论

CRT(受约束的随机测试)是产生验证复杂设计所需激励的唯一可行的方法。System Verilog提供了多种产生随机激励的方法。

发布了38 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45270982/article/details/95859255