随机约束中一些细碎的知识点

随机关键词rand只能在class或结构体里被声明,同样的randomize也只适用于对象。(或std::randomize)

2.关于solve…before…的说明

SystemVerilog中随机变量在常见的约束(符号约束、inside约束、条件约束、内嵌约束)条件下,其随机值出现的概率是均等的。但是 使用solve…before约束后,将会改变随机数值的出现几率,使得某些特定的取值情况更易出现。

2.1 没有solve…before…

class transaction;
  rand bit        a;
  rand bit[1:0]   data;

  constraint c1{ a -> data==3'h3;}     //条件约束 
endclass

module gen_data;
  initial begin
    transaction tr=new() ;
    for(int i=0; i<10; i++ ) begin
      tr.randomize() ;
      $display("a= %0d,  data= %0d",tr.a, tr.data) ;
    end
  end

endmodule

上边这个仅仅添加了一个条件约束,结果如下:

打印结果如下:
a= 0,  data= 2;
a= 0,  data= 2;
a= 0,  data= 3;
a= 0,  data= 1;
a= 0,  data= 0;
a= 0,  data= 2;
a= 1,  data= 3;
a= 0,  data= 3;
a= 0,  data= 1;
a= 0,  data= 1;

由于条件约束的存在,当a=1,data只能为3;而a=0,data可取0,1,2,3四种组合,所以共有5种组合,每种组合出现的概率相同,即1/5,如下表:

2.2 加上solve…before…

class transaction;
  rand bit        a;
  rand bit[1:0]   data;

  constraint c1{ a -> data==3'h3;       //条件约束 
                  solve a before data;}   //在给出data随机值之前先给出a的随机值  
endclass

module gen_data;
  initial begin
    transaction tr=new() ;
    for(int i=0; i<10; i++ ) begin
      tr.randomize() ;
      $display("a= %0d,  data= %0d",tr.a, tr.data) ;
    end
  end

endmodule

除了有一个条件约束外,还增加了solve…before…,随机的结果的概率会发生改变。

打印结果如下:
a= 1,  data= 3;
a= 0,  data= 2;
a= 0,  data= 3;
a= 0,  data= 1;
a= 1,  data= 3;
a= 0,  data= 2;
a= 1,  data= 3;
a= 0,  data= 3;
a= 0,  data= 1;
a= 0,  data= 1;

由于 solve a before data约束的存在,随机变量a会先被赋予随机值,a为1或0的概率为1/2,接下来再为data随机变量赋随机值,其概率取决于a的值,如下表:

 注意:randc类型变量不被允许使用solve…before约束;

转载:(1条消息) 【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?_字节地址低2位_IC二舅的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值