SV学习笔记(11)

本文详细介绍了SystemVerilog中的随机化技术,包括随机变量约束的双向性、位提取约束、关系操作和双向约束、使用`solve...before`引导概率分布、控制约束块、使用`randomize()`with额外约束、构造特定分布、提高求解器性能的技巧、随机脉冲类的实现、数组约束问题及解决、产生唯一元素值的数组、基于事务的随机生成以及随机器件配置。内容涵盖了从基础到高级的随机化应用场景。
摘要由CSDN通过智能技术生成

学习目标:

SV绿皮书第六章:随机化

学习内容:

1.SV的约束是双向的,它会同时计算所有的随机变量的约束
增加或者删除任一变量的约束都会直接或者间接影响所有相关变量的值的选取

2.高效地使用位提取的约束

rand  bit  [31:0]addr;
	constraint  near_page_boundry{
   
		addr[11:0]  inside  {
   [0:20],[4075:4095]};
	}

3.关系操作和双向约束

class  Imp2;
	rand  bit  x;			//0或1
	rand  bit [1:0]y;		//0,1,2或3
	constraint  c_xy{
   
		y>0;
		(x==0)  ->  y==0;
	}
endclass

由于关系操作是双向的,如果y为非零值,那么x的值将为1,又y>0,所以x不可能为0

4.使用solve…before约束引导概率分布(尽量不要使用solve before,会降低计算速度,也会使你的约束难看懂)

class  SolveBefore
	rand bit  x;
	rand bit  [1:0]y;
	constraint  c_xy{
   
		(x==0)  -> y==0;
		solve  x  before  y;			//求解器计算x的值为0或1,概率相等
	}
endclass

改为solve y before x,则为y=0,1,2或3的概率相等,y=1,2,3时,x不为0

5.控制多个约束块
用constraint_mode()函数打开或关闭约束
用handle.constrain.constraint_mod()控制一个约束块
用handle.constraint_mode()控制对象的所有约束

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();
	//用handle.constrain.constraint_mod()控制一个约束块
	p.c_short.constraint_mode(0);
	assert(p.randomize());
	transmit(p);

	//	用handle.constraint_mode()控制对象的所有约束
	p.constraint_mode(0);
	p.c_short.constraint_mode(1);
	assert(p.randomize());
	transmit(p);<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值