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

发布时间: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;
}
文章来源:https://blog.csdn.net/xiaotong121/article/details/135649246
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。