随机化——systemverilog,SV

简介

随机的对象不只是一个数据,而是有联系的变量集。通常变量会被封装在一个数据类中,同时需要在类中声明数据之间的约束关系。

要随机什么?

  • 器件配置:寄存器和系统信号
  • 环境配置:随机化验证环境
  • 原始输入数据:例如MCDF数据包的长度、宽度、数据间的顺序
  • 延时:握手信号之间的时序关系,例如valid和ready、req和ack之间
  • 协议异常:例如反馈信号给出异常,那么设计能否保持后续数据处理的稳定性

声明随机变量的类

可以用rand关键词来表明他们随机的属性,randc表示周期随机性,即所有可能的值都赋过值后随机值才可能重复

【rand和randc有且只能修饰类中的变量,类中局部变量也不能修饰】

随机属性要配合SV预定义的类随机函数 std::randomize()使用。即只有通过声明rand变量,并且在后期通过对象调用randomize()函数才能随机化变量

约束constraint也可同随机变量rand一起在类中声明

class Package;
    //声明随机变量
    rand bit[31:0] src,dst,data[8];
    randc bit[7:0] kind;
    //约束变量值
    constraint c {
   
   src>10,src<15};//要用花括号
endclass   
 
Package p;
initial begin
    p = new();//创建对象
    //利用句柄调用randomize()函数
    //立即断言assert
    //randomize()函数会返回一个值,0代表随机化失败,1代表随机化成功
    assert(p.randomize()) 
    else
    	$fatal(0,"Package::randomize failed");
    transmit(p);  
end
/*
  【rand 和 randc 的区别】
  以抽54张扑克牌为例
  rand表示抽牌后把牌放回去,每次抽牌1/54的概率 
  randc表示抽完就拿走,54次抽完后,会把所有牌抽出
*/

constraint的细节

  • 约束表达式的求解是由SV的约束求解器完成,满足约束的值是由**伪随机数发生器(PRNG)**从一个初始值产生。(不同工具的PRNG不同,产生的随机数也就不同)
  • SV只能随机化2值数据类型,也就是不能随机出X值和Z值,也无法随机化字符串
  • 注意定义变量位宽对约束的影响,比如 bit [2:0] month ,只能在0~7中选

权重分布

关键词dist可以在约束中用来产生随机数值的权重分布

符号用 “ := ” 或者 “ :/

:= 表示值范围内的每一个值的权重都是相同的

:/ 表示权重要平均分到值范围内的每一个值

值或者权重可以是常数或者变量

权重不用百分比表示,权重和也不必是100

src dist{
   
   0:=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小verifier

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

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

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

打赏作者

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

抵扣说明:

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

余额充值