SV(4)-随机化

本文介绍了在系统验证过程中可能出现的问题,如器件配置、环境配置等,并展示了如何使用随机变量创建类。通过具体示例讲解了如何定义约束,包括二进制约束、权重分布、条件约束等,并详细阐述了`inside`的用法、`$`符号的特殊含义以及如何控制约束的启用和禁用。此外,还探讨了内嵌约束,即通过`randomize()`with语句实现更复杂的随机数生成条件。这些技术在系统验证和测试用例生成中至关重要。
摘要由CSDN通过智能技术生成

1.一般设计那些地方会出问题

1)器件配置:(2)环境配置:(3)原始输入数据:(4)封装后的输入数据:
(5)协议异常:(6)延时:(7)事务状态:(8)错误和违规:

2.带有随机变量的简单类例子

class packet;
	//随机变量
	rand bit [31:0] src,dst,data[8]; //rand随机,每次随机的概率相同
	randc bit [31:0] kind;           //randc随机,每次随机之后会抽出随机概率会变大
	//src的约束
	constraint c {src>10;src<15;}      //约束语句,使用{}
endclss packet

packet p;
initial begin
	p = new();
	assert(p.randomize()); //断言语句,正确返回1,错误返回0
	else:$fatel(0);
	transmit(p);
end

3.关于constraint的注意点

1.constraint语句中可以使用if...else...等表达式
2.constraint中只能使用二进制约束

4.权重分布的两种方式
(1):=分布总和为相加数量
(2):/分布总和为100

rand int src,dst;
constraint c_dist{
src dist {0:=40,[1:3]:=60};
//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};
//dst = 0,weight = 40/100
//dst = 1,weight = 20/100
//dst = 2,weight = 20/100
//dst = 3,weight = 20/100
}

5.inside的用法

rand int c;
int lo , hi;
constraint c_range{
	c inside {[lo:hi]}; //等同于lo<=c;c<=hi; 
}
//如果想取反,可修改为 !(c inside{[lo:hi]});

6.$的使用方法

//$可以表示最大值和最小值
rand bit [6:0] b;
rand bit [5:0] e;
constraint c_range{
	b inside {[$:4],[20:$]}; //0<=b<=4 || 20<=b<=127
	e inside {[$:4],[20:$]}; //0<=e<=4 || 20<=e<=63
}

7.使用数组的随机集合约束

rand int f;
int fib[5] = '{1,2,3,4,5};
constraint fib_range{
	f inside fib;
	}

8.条件约束
->表达式可以达到case操作符的效果

class Busop;
	...
	constraint c_io{
	(io_space_mode)->
		addr[31]==1'b1;
	}

9.双向约束

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

在这里插入图片描述

10.约束的控制

class Packet;
	rand int length;
	constraint c_short{length inside {[1:32]};}
	constraint c_long {length inside {[1000:1023]};}
endclass

Packet p;
initial begin
	p = new();
	
	//constranint_mode()可以打开或者关闭约束控制块
	//通过禁止c_short约束产生长包
	p.c_short.constraint_mode(0);   
	assert(p.randomize());
	
	transmit(p);

	//通过禁止所有的约束,然后使能短包约束来产生短包
	p.constraint_mode(0);
	p.c_short.constraint_mode(1);
	assert(p.randmize());
	transmit(p);
end

11.内嵌约束

  • 使用randomize()with来内嵌约束
class Transaction;
	rand bit[31:0] addr,data;
	contrasint c1 {addr inside{[0:1000],[1000:2000]};}
endclass

Transaction t;

initial begin
	t = new();
	
	//addr 范围:50-100,1000-1500,data<10
	assert(t.randomize() with{addr>=50;addr<=1500;data<10;});
	driveBus(t);

	//强制addr取固定值,data>10
	assert(t.randomize() with{addr>=50;addr<=1500;data>10;});
	
	driveBus(t);
	end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马志高

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值