专栏首页杰瑞IC验证水果与盘子的随机问题?怎么搞

水果与盘子的随机问题?怎么搞

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一次性服务到位啦。

本文分享自微信公众号 - 杰瑞IC验证(Jerry_IC),作者:Jerry Ren

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • $sformatf() / $sformat()函数妙用

    字符串在验证平台中是经常被使用的,今天我们来说说在SystemVerilog中非常重要和常用的sformatf()/sformat()函数,他们是什么含义?如何...

    IC验证
  • 妙用合并数组

    把如上定义的128bit的data数据给我拆成以字节(8bit)为单位的数,后面要以字节为单位使用,怎么写?

    IC验证
  • get_name(),get_full_name(),get_type_name()...这些“小函数”能分清楚吗?

    在UVM中,有几个和“name”有关的“小”函数, 如get_name(), get_full_name(), get_type_name() ,set_nam...

    IC验证
  • mktorrent 制作私人种子 & Deluge 做种

    在 Windows OS 上,可以比较方便的使用qBittorrent等软件来制作和发布种子。 怎么在(无GUI)服务器上制作并发布一个种子呢? mktor...

    许杨淼淼
  • 干货!机器人、无人机产业链全景图

    来源:新材料在线

    机器人网
  • mysql子查询

    在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner sele...

    崔笑颜
  • GEO数据挖掘-第一期-胶质母细胞瘤(GBM)

    lncRNAs PVT1 and HAR1A are prognosis biomarkers and indicate therapy outcome for...

    用户6148842
  • 掌握了Docker Layer Caching才敢自称精通Dockerfile

    长话短说:本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建。

    小码甲
  • GEO数据挖掘-第一期-胶质母细胞瘤(GBM)

    lncRNAs PVT1 and HAR1A are prognosis biomarkers and indicate therapy outcome for...

    生信技能树
  • 前端快速入门之概述

    以下是对(前端)可视化工作的并不系统的总结,新手向,主要是想说一下前端如何组成、功能如何实现、资源如何请求,进而说到数据如何显示,并在最后列举了一些十分重要的参...

    ZONGLYN

扫码关注云+社区

领取腾讯云代金券