【随机化约束的种类_2024.01.17】

//需要随机化的情况
	器件配置
	环境配置
	原始输入数据
	延时
	协议异常

实现方式

rand(抓完放回)/randc(抓完不放回)进行随机,通过constraint {}约束块
在这里插入图片描述

分类

按{}中的内容分为:范围、权重、条件约束

范围

布尔表达式

	lo<x;
	x<hi;//(大于小于要分开写,lo<x<hi是不允许的)

范围表达式

	c inside{[lo:hi]};//lo<=c && c<=hi
	!(c inside{[lo:hi]});//c<lo or c>hi
//$指定上下限
	rand bit[6:0]b;
	constraint c_range
	{
		b inside{[$:4],[20,$]};//0<=b<=4 || 20<=b<=127
	}
//使用数组
	rand bit[6:0]b;
	int fib[5]='{1,5,3,9,2};
	constraint c_range
	{
		b inside{fib};//b取1,5,3,9,2
	}

权重

权重分配

变量名 dist{0:=40,[1:3]=60};
//权重相等,变量=0,weight=40/220;变量=1,weight=60/220
变量名 dist{0:/40,[1:3]/60};
//均分权重,变量=0,weight=40/100;变量=1,weight=20/100

带变量的权重分配

typedef enum {A, B, C} r;
class R;
	rand r;
	int a=1, b=1, c=1;
	constraint c
	{{
		A := a, B := b, C := c
	};}
endclass

条件

constraint c_stim
{
	if (flag)
	{
		dst inside {[40:80]};
	}// if后多个语句不用begin_end,用{}
	else
	dst inside {[2:10], [50:67]};
}
constraint c_stim
{
	flag -> dst inside {[40:80]};
	!flag -> dst inside {[2:10], [50:67]};
}//条件语句和执行语句是同时随机的

外部约束

对某一变量采用不同约束

class Packet;
	rand bit [7:0] length;
	rand bit [7:0] payload[];
	constraint c_valid {length > 0;payload.size() == length;}
	constraint c_external;
endclass
constraint Packet::c_external {length == 1;} //在类外定义

双向约束

约束块不像自上而下执行的程序性代码,为声明性的代码,是并行执行的;所有的
约束表达式同时有效,取交集

rand logic [15:0] r,s,t;
constraint c_bitir {
	r < t;
	s == r;
	t <30;
	s >25;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iKUNqa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值