【数字IC前端】学习随笔(4)——约束&随机

安利 路科验证 随机约束和分布可以随机什么内容?声明随机变量的类随机约束和分布可以随机什么内容?器件配置:通过寄存器和系统信号环境配置:随机化验证环境,例如合理的时钟和外部反馈信号原始输入数据:例如MCDF数据包的长度、带宽,数据间的顺序延时:握手信号之间的时序关系,例如valid和ready,rea和ack之间的时序关系协议异常:如果反馈信号给出异常,那么设计是否可以保持后续数据处理的稳定性呢?声明随机变量的类随机化是为了产生更多可能的驱动,因此在软件世界**"class"一侧的
摘要由CSDN通过智能技术生成

安利: 路科验证

1. 随机约束和分布

可以随机什么内容?

  • 器件配置:通过寄存器和系统信号
  • 环境配置:随机化验证环境,例如合理的时钟和外部反馈信号
  • 原始输入数据:例如MCDF数据包的长度、带宽,数据间的顺序
  • 延时:握手信号之间的时序关系,例如valid和ready,rea和ack之间的时序关系
  • 协议异常:如果反馈信号给出异常,那么设计是否可以保持后续数据处理的稳定性呢?

声明随机变量的类

  • 随机化是为了产生更多可能的驱动,因此在软件世界**"class"一侧的运用更多,所以我们倾向于将相关数据有机整理在一个类的同时,也用rand**关键词来表明它们的随机属性。
  • randc表示周期随机性,即所有可能的值都赋过值后随机值才可能重复。
  • 随机属性需要配合SV预定义的类随机函数**std::randomize()使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()**函数才可以随机化变量。
  • 约束constraint也同随机变量一起在类中声明。
class Packet;
  // The random variables 
  rand bit [31:0] src, dst, data [8] ;
  randc bit [7:0] kind;
  // Limit the values for src 
  constraint c {
   src > 10; src < 15;}
endclass

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

约束的概念

  • 约束表达式的求解是由SV的约束求解器(constraint solver)完成的。
  • 求解器能够选择满足约束的值,这个值是有SV的PRNG(伪随机数发生器Pseudo random number generator)从一个初始值(seed)产生。只要改变种子的值,就可以改变CRT的行为。
  • SV标准定义了表达式的含义以及产生的合法值,但没有规定求解器计算约束的准确顺序。这即是说,不同仿真器对于同一个约束类和种子值求解出的数值可能是不相同的
  • 什么可以被约束?SV只能随机化2值数据类型,但位可以是2值或4值。这即是说,无法随机化出X值和Z值,也无法随机化字符串。
class date; 
	rand bit [2:0] month; 
	rand bit [4:0] day; 
	rand int year; 
	constraint c_date{
   
		month inside {
   [1:12]}; 
		day inside {
    [1:31]}; 
		year inside {
    [2010:2030]};
}
endclass

本例中Month 不超过7,day不超过31,year只需要在2010~2030之间即可。

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 e_stim {
   
		len < 1000; 
		len >o; 
		if (congestion_test){
   
			dst inside {
   [CONGEST_ADDR-
						100:CONGEST_ADDR+100]};
			src == CONGEST_ADDR;
		}
		else
		src inside {
   0, [2:10], [100:107});
}
endclass

权重分布

  • 关键词dist可以在约束中用来产生随机数值的权重分布,这样某些值的选取机会要比其他值更大一些。
  • dist操作符带有一个值的列表以及相应的权重,中间用:=或:/分开。值或权重可以是常数或者变量
  • 权重不用百分比表示,权重的和也不必是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/
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值