当前位置 博文首页 > 杰瑞IC验证的博客:水果与盘子的随机问题?怎么搞

    杰瑞IC验证的博客:水果与盘子的随机问题?怎么搞

    作者:[db:作者] 时间:2021-07-18 22:24

    Jerry今天去超市买水果了,买了四种水果,分别是苹果、橙子、香蕉、梨。为什么这四种?可能是因为刚好促销吧,盛情难却(与插图不符哦)。回来以后打算每种水果吃一个,为了增强仪式感以搭配Jerry高贵的气质,于是决定用四个盘子分别盛放一个水果,沐浴更衣焚香,准备刀叉筷子红酒,仔细品尝其中滋味。

    在沐浴之时突然想到一个验证初学者可能不会的问题,于是感慨万千。Jerry把这个问题就命名为“水果与盘子问题”。

    Jerry所谓的“水果与盘子问题”其实指的是这样一个约束问题:我们把这四种水果看成四组数据、或者简单点就是四个数据,这四个数据是随机的(拿水果来说例如水果的大小尺寸、光泽亮度、水分等等),对这个数的参数随机是简单的,但是我想既对这个数随机又对水果与盘子的对应关系随机怎么办?比如我苹果不一定装在第一个盘子里,而可能在其他的盘子?怎么弄?

    准确的说这个问题应该叫“水果与盘子的对应关系问题”。

    上代码!!

    首先Jerry把问题代码化明确起来:

    rand bit [7:0] plate [4] ; //这个数组就是我们定义的四个盘子
    rand bit [7:0] apple;
    rand bit [7:0] orange;
    rand bit [7:0] banana;
    rand bit [7:0] pear;

    constraint jerry_fruit { //四个水果分别进行随机
    apple inside {[2:11]};
    orange inside {[70:111]};
    banana inside {[0:4]};
    pear inside {[5:29]};
    }

    function void post_randomize( );  //我们把四种水果分别放到四个盘子里
       plate[0]=  apple;
       plate[1]=  orange;
       plate[2]=  banana;
       plate[3]=  pear;
     endfuction 
    

    如上代码,我们把这四种水果与盘子plate[ ]的对应关系怎么随机起来?凭什么apple只能装plate[0]?万一我想要装plate[3]呢?

    老规矩,先想想,不要往下翻了哦~~

    果然,关注jerry的还是那么聪慧!!

    没错,我们可以再加一道随机!用骰子决定!

    来!请先熟背Jerry心法:

    “Jerry水果盘子题,随机水果随关系“
    关系随的是编号,关键词unique是玄机!”

    再上代码!

    rand bit [7:0] plate [4] ;
    rand bit [7:0] apple;
    rand bit [7:0] orange;
    rand bit [7:0] banana;
    rand bit [7:0] pear;

    rand bit [1:0] jerry_r [4]; //各位观众!jerry_r 就是我们的编号随机数组了!

    constraint jerry_fruit {
    apple inside {[2:11]};
    orange inside {[70:111]};
    banana inside {[0:4]};
    pear inside {[5:29]};
    }

    constraint jerry_list {
    unique {jerry_r}; //关键词unique就是关键了!
    }

    function void post_randomize( ); //我们把原固定编号换成编号随机数组!搞定
       int i=0;
       plate[jerry_r[i++]]=  apple;
       plate[jerry_r[i++]]=  orange;
       plate[jerry_r[i++]]=  banana;
       plate[jerry_r[i++]]=  pear;
     endfuction 
    

    太感动了,加了短短几行代码就可以实现了这个功能!有初学者问unique这个关键词什么作用?

    Jerry再多说一句:unique主要针对的对象是,一组变量的这类情况,比如我们用的这个数组。当每次随机后,通过unique约束的这一组变量中,没有两个成员是相等的,他们都是独一无二的。因为我们的编号其实就是独一无二的,我们的前提是每个盘子只放一个水果!所以这样写是再合适不过的了!jerry_r是一个2bit的数组,也就是只能是0,1,2,3四个数,通过unique就会随机的独一无二的放到它的四个空间中。

    后面通过计数因子i来顺序调用jerry_r中的编号,当然这里可以不写i++,也可以直接0,1,2,3直接调,但是如果盘子更多怎么办呢?所以Jerry一次性服务到位啦。

    怎么样?有没有感觉到验证代码之美呢?今天Jerry说的水果盘子问题,你记住了吗?大家有什么建议或问题都可以直接反馈同名公众号哈Jerry和大家一起成长

    cs