SV---随机约束和分布

 为什么需要随机

1.芯片越来越复杂,定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高。

2.定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你自己都想不到的缺陷。

为什么需要约束

 没有约束,产生有效激励的同时也产生了很多无效和非法的激励。

1.声明随机变量的类

关键字:rand/randc,只能出现在class中,用来修饰成员变量。

rand:每次随机的概率都是一样的,假设随机10次,每次都是1/10。

randc:每做一次随机,总数会减1,假设随机10次,第一次随机盖率是1/10,那么第二次就是1/9 。表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。

 

class Packet;
	//The random variables
	rand bit [31:0] src, dst, data[8];
	randc bit [7:0] kind;
	// Limit the value for src
	constraint c {
                   src > 10;
                   src < 15;
                }
endclass

Packet P;
initial begin
	P = new();//Create a packet
	assert (	packet.randomize())
		else $fatal(0,"Packet::randomize failed");
	transmit(p);
end 

需要随机的变量有四个,只要其中一个约束有问题,那么所有变量都没有进行随机

2.约束

例题

class data;
	rand bit [2:0] mouth;
	rand bit [4:0] day;
	rand int year;
	
	constraint c_data {
		month inside {[1:12]};
		day inside {[1:31]};
		year inside {[2010:2030]};
		}
endclass

注:inside是常见的约束运算符

解析:对于D明显不满足year在[2010:2030]之间的约束。

           对于C,第二行定义month只有三位,所以只能表示0-7,结合约束里面的1-12,所以满足month的条件是1-7,C错。

           答案是AB

代码练习

class Stim;
	const bit [31:0] CONGEST_ADDR = 42; //定义常量
	typedef enum {READ,WRITE,CONTROL} stim_e; //自定义枚举类型
	randc stim_e kind;    //Enumerated var
	rand bit [31:0] len,src,dst;  //随机变量
	bit congestion_test; //非随机变量
	
/***************约束*******************/
	constraint c_stim{
		len < 1000;
		len > 0;
		if (congestion_test){
			dst inside {[CONGEST_ADDR + 100:CONGEST_ADDR - 100]};
			src == CONGEST_ADDR;
		}
		else
		src inside {0,[2:10],[100:107]};
	}
endclass

3.权重分布

关键词:dist。

1)可以用来产生随机数值的权重分布。

2)dist操作符带有一个值得列表以及相应得权重,中间用:=或:/分开。值和权重可以是常数或者变量。下图的范围就是变量lo,hi。

3)权重不是百分比表示,权重的和也不必是100

4):= 和 :/具体使用方法看下面的代码

具体代码:

rand int scr,dst;
constraint c_dist{
	src dist {0:=40,[1:3]:=60};// :=的意思是产生40个0,1-3每个数产生60个,共产生220个数
        //src = 0,weight(权重) = 40/220
        //src = 1,weight(权重) = 60/220
        //src = 2,weight(权重) = 60/220
        //src = 3,weight(权重) = 60/220
	dst dist (0:/40,[1:3]:/60);// :/的意思是0的概率是40%,1-3的概率一共是60%
        //dst = 0,weight(权重) = 40/100
        //dst = 1,weight(权重) = 20/100
        //dst = 2,weight(权重) = 20/100
        //dst = 3,weight(权重) = 20/100
}

$的使用方法

可以通过 “->”或者if-else来让一个约束表达式在特定时刻有效。

 所有的约束表达式都是并行的(单个约束块里多个约束条件和多个约束块都是并行的),如下面代码所示

rand logic [15:0] r,s,t;
constraint c_bidir{
	r < t;
	s == r;
	t < 30;
	s > 25;
}

如果你开始从r < t开始计算,令r=20,t=21,->s == r = 20,t < 30满足,但 s=20不满大于25的要求,所以不是并行计算的。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值