【验证小白】随机中使用post_randomize的正确姿势

前言

今天头疼了一天,回来玩了会游戏后感觉还有力气翻一翻之前的笔记~最近晚上没事就翻一下笔记和总结,还是感叹于当时自己的~~~勤劳勇敢有力气!这次记录的是之前遇到的一次改了环境后回归时间直接拉满的大坑以及解决方式;

案件回放

事情的经过是这样的,原本当时我搞的仿真环境呢是个自由烂漫的环境,里面的随机真的是非常的随机,就属于那种你们随便浪随机出事来我再看的状态(因此一直觉得验出来的RTL稳健性都很强,一般错误都冲不垮的那种);

但是因为太随机了,一直到锁代码都没能跑出来一个id之间耦合关系导致的bug。客观来看毕竟好几千id,耦合关系还挺复杂的,还涉及到内部逻辑判定和时序级判定耦合,的确是从随机的角度非常难以构造。当然这都不是重点,反正最后我是想出弥补办法了于是搞了几个ID池,分别用来存各种情况的ID,最开始的代码实现大概是这个样子的:

class pkt_data;

	int      block_id_q[$]; //2~2048深
    int      nblock_id_q[$];//2~2048深
	rand int data_id;
	
	constraint pkt_len_cons{
        xxx -> data_id inside block_id_q;
        yyy -> data_id inside nblock_id_q;
	};
		
endclass

这么一弄呢,就能从大面上cover很多的问题了。然后我就开心的拿去回归了,平时两千来个case一晚再加晚点上班也就跑完了,然后那次大概其是跑了好几昼夜,感觉集群是不是都着起来了也没跑完;

这一看这样搞下去过年不用放假了啊,赶紧请我师父给我看下咋回事。师父还是非常有经验,鼓捣了一会就发现这块解随机的时间实在是太长了,机器有点撑不住,于是问题的关键就是怎么样用小代价仍旧实现这个功能;

点题时刻~最后的解决办法就是,放弃inside,改用shuffle函数处理,于是代码改成了这个样子:

class pkt_data;

	int      block_id_q[$];
    int      nblock_id_q[$];
	rand int data_id;
	
	constraint pkt_len_cons{
        xxx -> data_id == this.block_id_q[0];
        yyy -> data_id == this.nblock_id_q[0];
	};
	
    extern function void post_randomize();
	
endclass

function void pkt_data::post_randomize();
    this.block_id_q.shuffle();
    this.nblock_id_q.shuffle();
endfunction

这样就让环境行为由“每次随机都由几千深度的queue中选择一个值”调整为“每次随机后,打乱一下queue”,从随机的角度看行为没有变化,但是复杂度应该是低了很多;

当时我就觉得吧,我师父的水平确实高出我不少~学无止境学无止境~

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尼德兰的喵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值