数字IC验证23823--随机化

随机函数

  • pre_randomize()和post_randomize()
  • 使用场景:在调用randomize()之前或之后需要立即执行一些操作
  • 这两个函数是void类型,如果需要在里面调用调试程序,那么调试程序必须是函数类型
  • 用两条指数曲线构造浴缸形分布
class bathtub;
	int value;
	int width=50, depth=4, seed=1;
	
	function void pre_randomize();
		value=$dist_exponential(seed,depth);
		if(value>width) value=width;
		if($urandom_range(1)) value=width-value;
	endfunction
endclass

随机数函数

  • $random()——平均分布,返回32位有符号随机数
  • $urandom()——同上,无符号
  • $urandom_range(a,b)——在指定范围内同上,上下限位置不限,只有一个表示0-a/b
  • $dist_exponential()——指数衰落
  • d i s t n o r m a l ( ) ——钟型分布,还有 dist_normal()——钟型分布,还有 distnormal()——钟型分布,还有dist_poisson()
  • $dist_uniform()——平均分布

数组约束

  • 动态数组可以约束:元素;数值
  • 数组的大小要给定范围,防止生成体积过大的数组或者空的数组
  • class dyn_size; rand logic [31:0] d[];//随机的动态数组 constraint d_size {d.size() inside {[1:10]}}//元素个数限制,但是每个元素的数值大小没有约束 endclass
class good_sum5;
	rand uint len[];
	constraint c_len{
		foreach (len[i]) len[i] inside {[1:255]};
		len.sum<1024;
		len.size() inside {[1:8]};  }
endclass

产生唯一元素值的数组

  • randc的话数组中的每一个元素只会独立地随机化
  • 用foreach嵌套来实现
class uniqueslow
	rand bit [7:0] ua[64];
	constraint c {
		foreach (ua[i])
			foreach (ua[j])
				if (i!=j) ua[i]!=ua[j];
}
endclass

随机化句柄数组

  • 功能:产生多个随机对象
  • 随机句柄数组一定要加上rand,在调用前保证每一个句柄元素都是非悬空的
  • 在随机化前分配所有的元素,随机化不会创建对象,动态句柄数组的大小只会不变或减小,不会增加
parameter max_size=10;
 
class randstuff;
	bit [1:0] value=1;//不论随机化出多少个句柄。value只有1。如果加上rand,那就可以是其他值
endclass
 
class randarray;
	rand randstuff array[];//存放句柄的动态数组
	constraint c{
		array.size() inside {[1:max_size];}//约束在1-10个
	}
 
function new();//如果没有这个函数,就报错:句柄不能悬空,在随机化前必须指向对象
	array=new[max_size];//给数组分配最大的容量
	foreach (array[i])
	array[i]=new();//开辟10个句柄空间,句柄指向10个对象
endfunction
endclass
 
randarray ra;
initial begin
	ra=new();//创建10个对象
	assert(ra.randomize());//随机化数组的元素,不一定是10个,
	foreach (ra.array[i])
		$display(ra.array[i].value);
end
 

随机序列

  • 用randsequence产生原子测试序列
  • 类比case语句,多了权重
initial begin
	for (int i=0; i<15; i++) begin
		randsequence(stream)//stream序列有三个入口
			stream : cfg_read :=1 |
							 io_read :=2 |
							 mem_read :=5;
			cfg_read :{cfg_read_task;} |
								{cfg_read_task;} cfg_read;//用或表示可能执行两种结果,task或者task之后继续这个通道
			mem_read :{mem_read_task;} |
								{mem_read_task;} mem_read;
			io_read :{io_read_task;} |
								{io_read_task;} io_read;
		endsequence
end
 

randcase建立随机决策树

  • 缺点:没有变量可供追踪调试
  • randcase权重在前,冒号后表范围
 
initial begin
	int len;
	randcase 
		1: len=$urandom_range(0,2);//10%的概率是0-2
		8: len=$urandom_range(3,5);
		1: len=$urandom_range(6,7);
	endcase
	$display("len=%0d", len);
end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值