SV学习笔记(12)

学习目标:

SV绿皮书第六章:随机化

学习内容:

1.数组大小约束

class  dyn_size;
	rand  logic  [31:0]d[];
	constraint  d_size  {d.size()  inside  {[1:10];}
endclass

2.约束数组中元素

class  good_sum5;
	rand  uint_len[];
	constraint  c_len{
		foreach  (len[i])	len[i]  inside {[1:255]};
		len.sum()<1024;
		len.size()  inside {[1:8];}
endclass

还可以在约束中结合数组的其他方法sum(),product(),and(),or()和xor()

3.产生唯一元素值的数组

class UniqueSlow;
	rand bit  [7:0] ua[64];
	constraint  c{
		foreach  (ua[i])
			foreach  (ua[j])
				if(i!=j)
					ua[i]!=ua[j];
}

4.利用randc变量来生成唯一元素值的数组

class randc8;
	randc  bit [7:0]val;
endclass

class  LittleUniqueArray;
	bit [7:0]ua[64];
	function	void pre_randomize();
	randc8 rc8;
	rc8=new();
	foreach  (ua[i]) begin
		assert(rc8.randomize());
		ua[i]=rc8.val;
	end
	endfunction
endclass

调用randomize前,系统会自动帮我们调用pre_randomize()

5.数据约束例子

class packet;
	rand  bit [3:0]da[];
	constraint  da{
		da.size()  inside {[3:5]};
		foreach(da[i])  da[i]<=da[i+1];    //i=4时会产生错误,da最大为[4],却有da[4]<=da[5],应该加if限制防止超范围
		}
endclass
packet  p;
initial begin
	p=new();
	p.randomize()  with  {da.size()  inside{3,5};};
end

6*.随机化句柄数组的功能:随机化数组中的每一个句柄所指向的对象。(每一个句柄都必须是非悬空的)
如果想要产生多个随即对象,你可以建立随机句柄数组。(随机求解器不会创建对象)
动态数组事先分配最大数量的元素,然后使用时用约束减小数组的大小。(在随机化时,动态句柄数组大小只能不变/减小)

parameter  MAX_SIZE=10;
class  RandStuff;
	bit [1:0] value=1;			//未声明未随机变量
endclass

class RandArray;
	rand  RandStuff array[];		//声明随机句柄数组
	constraint  c{
		array.size()  inside  {[1:MAX_SIZE]};}
	function  new();
	//分配最大容量
	array =new[MAX_SIZE];
	foreach  (array[i])
		array[i]=new();
	endfunction
endclass

RandArray ra;
initial  begin
	//构造数组和所有对象
	ra=new();
	//随机化数组,但可能会减小数组
	assert(ra.randomize());
	foreach(ra.array[i])
		$display(ra.array[i].value);
end

ra.randomize() with {array.size==2}的解为array[0].value=1,array[1].value=1
随机化函数随机化了句柄所指对象,但因为数组元素未被声明为随机变量,所以句柄值固定

7.randsequence和randcase
randsequence的相关功能在协调激励组件和测试用例时用到
randcase则对应着随机约束中的dist权重约束+if-else条件约束的组合

问题:

学习时间:

晚:20-22

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值