1.为什么引入随机化?

  1. 芯片体积增大,复杂度日渐提高,定向测试已经无法满足验证的需求,而随机测试的比例逐渐提高
  2. 定向测试能找到你认为可能存在的缺陷,而随机测试可以找到连你都没有想到的缺陷
  3. 随机测试的环境要求比定向测试复杂,它需要激励、参考模型和在线比较,上百次的仿真不再需要人为参与,以此来提高验证效率
  4. 随机测试相对于定向测试可以减少相当多的代码量,而产生的激励较定向测试也更多样

2.什么需要随机化测试?

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

3.随机化方法

常用的随机化方法是使用关键词rand和randc来产生随机序列,二者区别如下所示:

//rand 普通随机,每个周期出现的值可以重复
class rand;rand bit[1:0] x;
endclass
// 随机5次的结果:0 3 0 2 1 ,它们出现的概率都是1/4//randc 周期性随机,每个周期出现的值不重复
class randc;randc bit[1:0] y;
endclass
// 随机5次的结果: 0 3 2 1 3 , 第一个数0出现的概率是1/4,由于每个周期出现的值不重复,所以第
二个值3出现的概率就是1/3,第三个值2出现的概率就是1/2,第四个值1出现的概率就是1/1;然后进入下
一个周期

4.随机约束种类

4.1布尔表达式 Boolean expressions

布尔表达式就是用最简单的不等式规定变量的取值范围或者相互之间的大小关系

class order;rand bit[7:0] lo,med,hi;constraint bad//等效于lo<med<hi,但是sv中一次只能识别一个不等号,所以要按如下分开写{lo<med;med<hi;}
endclass

4.2权重分配 Weighted distributions

权重分配即将每个值出现的概率确定下来。

权重分配有两种表达方式,分别为:=和:/,二者的用法和区别如下所示:

class wd;rand int src,dst;constraint c_dis{src dist{0:=40,[1:3]:=60};//A:=B表示A的权重是B,[1:3]:=60表示1,2,3的权重各为60/* src=0,weight=40/220src=1,weight=60/220src=2,weight=60/220src=3,weight=60/220 分母220=40+60*3      */dst dist{0:/40,[1:3]:/60};//A:/B表示A的权重是B,[1:3]:/60表示1,2,3的权重各为60/3=20/* dst=0,weight=40/100dst=1,weight=20/100dst=2,weight=20/100dst=3,weight=20/100 分母100=40+20*3      */}
endclass

4.2.1带变量的权重分配

typedef enum {READ8,READ16,READ32} read_e;class ReadCommands;rand read_e read_cmd;int read8_wt=1,read16_wt=1,read32_wt=1;//权重值constraint c_read{read_cmd dist{READ8:=read8_wt,  //READ8概率1/3READ16:=read16_wt,//READ16概率1/3READ32:=read32_wt //READ32概率1/3};}
//通过这种变量赋值权重值的方式,可从类的外部通过变量改变权重值
endclass

4.3范围表达式 Range expressions

class RV;rang int c;int lo,hi;//规定随机值的上下限constraint c_range{c inside{[lo,hi]};//lo<=c<=hi}//随机值上下限取反constraint c_range{!(c inside{[lo,hi]});//c<lo or c>hi}//$指定上下限rand bit[6:0]b;rand bit[5:0]e;constraint c_range{b inside {[$:4],[20:&]};//0<=b<=4 or 20<=b<=127;$在左边代表最小值,$在右边代表最大值e inside {[$:4],[20:&]};//0<=e<=4 or 20<=e<=63}//使用数组rand bit[6:0]f;int fib[5]='{1,5,3,9,2};constraint c_range{f inside fib;//f的取值在fib这个数组中取}endclass

4.4条件表达式 Conditional expressions

class stim;bit flag;rand bit[31:0] dst;constraint c_stim{if(flag)//如果flag=1,则dst范围是40-80{dst inside {[40:80]};}else//如果flag!=1,则dst范围是2-10 or 50-67{dst inside {[2:10],[50,67]};}//另一种写法constraint c_stim{flag -> dst inside {[40:80]};!flag -> dst inside {[2:10],[50,67]};}
endclass

4.5外部约束

外部约束是指类中不直接规定该约束,而是在外部使用时再规定此约束,如下所示:

class Packet;rand bit[7:0] length;rand bit[7:0] payload[];//动态数组constraint c_valid{length>0;payload.size()==length;}constraint c_external;//未规定约束
endclassprogram test;······constraint Packet::c_external{length==1};//注意使用::
endprogram

4.6双向约束

约束块不像自上而下执行的程序性代码,它们是声明性的代码,是并行执行的,所有的约束表达式同时有效,故SV会同时计算所有的随机变量约束,取它们的交集。

class sx;rand logic [15:0] r,s,t;constraint c_bitir//等价于25<s==r<t<30{r<t;s==r;t<30;s>25;}
endclass

System Verilog学习笔记—随机化约束种类相关推荐

  1. System Verilog学习笔记—随机化约束的控制

    目录 1.控制多个约束块儿constraint_mode() 2.控制随机变量 2.1 rand_mode() 2.2 randomize() with {} 2.3 randomize单独控制变量 ...

  2. System Verilog学习笔记—接口interface

    目录 0.interface的直观理解 1.使用端口的TB与DUT通信 2.使用接口的TB与DUT通信 3.使用modport将interface中的信号分组 4.接口中的clocking block ...

  3. SV学习笔记—随机化约束的概率

    1.没有约束的类 x可能是0/1,y可能是0/1/2/3,是rand随机,每个数的概率相等: 运行800次,从结果看每个数出现的概率确实是1/8 2.关系操作 运行800次,从结果看,各个出现的值是1 ...

  4. System Verilog学习笔记—虚接口(virtual interface)

    1.虚接口(virtual interface) 1.1为什么引入虚接口? 我们知道,通过引入interface可以简化模块儿之间的连接,即interface是连接硬件的,其是硬件语言:但对于验证来说 ...

  5. System Verilog学习笔记—fork...join_xxx的三种用法及wait fork和disable fork

    目录 0.前言 1.fork...join 2.fork...join_any 3.fork...join_none 4.其它线程执行语句 4.1wait fork 4.2 disable fork ...

  6. system generator学习笔记【02】

    作者:桂. 时间:2018-05-20  23:28:04 链接:https://www.cnblogs.com/xingshansi/p/9059668.html 前言 继续学习sysgen.接触s ...

  7. Verilog学习笔记-——Verilog模块例化

    Verilog学习笔记---Verilog模块例化 在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化.模块例化建立了描述的层次.信号端口可以通过位置或名称关联,端口连接也必须遵循一些规则 ...

  8. 【Verilog学习笔记】D触发器(门级和行为级)+4位寄存器+一个完整的激励程序

    [Verilog学习笔记]D触发器(门级和行为级)+4位寄存器+一个完整的激励程序 首先展示以下完整的程序 `timescale 1ns / 1psmodule hardreg( input wire ...

  9. 我的 System Verilog 学习记录(1)

    引言 技多不压身,准备开始学一些 System Verilog 的东西,充实一下自己,这个专栏的博客就记录学习.找资源的一个过程,希望可以给后来者一些借鉴吧,IC找工作的都加把油! 本文是准备先简单介 ...

最新文章

  1. 的不定积分_不定积分练习_09/11/2020
  2. mysql命令行批量添加数据_mysql命令行批量插入100条数据命令
  3. torch max 判断与筛选
  4. pip 指定 安装源
  5. tensorflow运行环境linux,在ubuntu或者min运行环境下安装gpu版本的tensorflow
  6. 【职场】高薪的条件你满足几条?
  7. 怎么把线稿提取出来_如何快速提取漫画线稿?【漫画技巧】
  8. 抽象同步器AQS应用之-- Semaphore、CountDownLatch、CyclicBarrier的介绍
  9. dockerfile构建镜像
  10. c语言程序 数字时钟的设计,数字时钟C语言设计
  11. 新书介绍:CCNA基础教程
  12. 2012共享文件服务器,win server2012 r2 服务器共享文件夹设置
  13. 1983年图灵奖--肯尼斯·汤普森和丹尼斯·里奇简介
  14. Android 项目使用 Jenkins 打包时的异常问题 AAPT: C:\Windows\System32\config\systemprofile\.gradle\caches
  15. 计算机保研面试英文,计算机保研面试英文自我介绍范文
  16. 双卡手机,sim卡状态改变测试
  17. 数据恢复揭秘:三星硬盘开盘数据恢复全过程
  18. 推荐使用rpx替代upx的公告
  19. C++判断系统位数(64位或32位)
  20. Java spring boot 实现支付宝支付

热门文章

  1. 不退出_老人带娃也要有时间限制,这个时间不退出,影响家庭幸福
  2. Android 集成百度文字识别OCR身份证银行卡驾驶证识别
  3. windows下git客户端的下载安装及使用教程
  4. excel数据拆分怎么做
  5. 电脑工作者保护自己的眼睛
  6. android以ini文件形式保存在内部存储_彻底了解android中的内部存储与外部存储
  7. 小雅深访 | 谢治宇最完整投资框架(2020年4月)
  8. TDDI/ITD原理总结(touch 自容原理)-----/*自己总结*/
  9. ios 简书 获取通讯录信息_当心!你用的共享充电宝可能被植入木马盗取信息
  10. 电子罗盘详解之地磁场和航向角