SV中的随机化约束

news/2024/7/24 6:49:47 标签: 开发语言

1.多个变量相互依赖,如何进行随机化?

采用solve before 

(1)constraint c_valid_write_data {
    solve access_type  before data;
    solve burst_length before data;

    (access_type == TVIP_AXI_WRITE_ACCESS) -> data.size() == burst_length;
    (access_type == TVIP_AXI_READ_ACCESS ) -> data.size() == 0;

    foreach (data[i]) {
      (data[i] >> this.configuration.data_width) == 0;
    }
  }
(2) constraint c_write_data_delay {
    solve access_type, burst_length  before write_data_delay;

    if (access_type == TVIP_AXI_WRITE_ACCESS) {
      write_data_delay.size() == burst_length;
    }
    else {
      write_data_delay.size() == 0;
    }

    foreach (write_data_delay[i]) {
      `tvip_delay_constraint(write_data_delay[i], this.configuration.write_data_delay)
    }
  }

 分步求解1:

 有三个数组,每个元素的取值范围是1-9,三个数组的和是100,三个数组中5的个数不能超过10个。

拆分,需要随机的内容包含:(1)变量取值范围(2)变量和的范围(3)变量个数(4)数组中5的个数不超过10个。

(1)~(3)都可以设定一个变量,通过变量来约束

(4)两种解决方案,第一个就是随机的过程中不随机5,随机完了之后再去插入5;通过调整权重,然后进行永久循环随机,通过find_index with找到5,并且总的数组含量大于5的情况下在退出随机,否则就一直进行随机

参考博客:[SV]Constraint 遇到的问题_随机约束 父类和子类冲突_lbt_dvshare的博客-CSDN博客

分步求解2:

分三层进行随机(具体分几层由变量和变量之间的层次关系决定)

   

核心在于不借助solve before的方式进行随机 


class packet;
  rand  bit [7:0] addr0;
  rand  bit [7:0] addr1;
  rand  bit [7:0] addr2;
  bit[1:0]      layer;    
 

 function void pre_randomize();
    if(layer == 'd0)begin 
        addr1.rand_mode(0);
        addr2.rand_mode(0);
    end
    else if(layer == 'd1)begin
        addr0.rand_mode(0);
        addr2.rand_mode(0);
    end
    else if(layer == 'd2)begin          
        addr0.rand_mode(0);
        addr1.rand_mode(0);
    end
  endfunction
endclass

不仅仅可以使用rand mode也可以使用constrain mode 

有个问题,每次随机的时候,上一个变量的rand mode关闭了,还需要重新打开吗???

代码踩坑:

1

rand a ;
rand b ;
rand c ;

`uvm_do_on_with{
    a = b + c ;
    a = b ;
    a = {b,c} ;
}

2.

(1)针对有符号变量相加过程中随机到负值->改为无符号变量(int是有符号变量)

(2)针对无符号变量相加过程中随机出现溢出的情况->sum值位宽大一位

注意,再比如a+b == 10的约束中,10没有明确指定位宽的化此时会采用默认的32bit位宽。所以需要改为a+b == 33'b10的约束形式。

(3)数组随机,在使用sum函数的时候一定要注意,为了避免上面两种情况,一定要县约束每个变量大致范围,在使用sum函数进行约束

参考链接:

SV学习笔记—变量及数组随机化约束常犯的错误-爱代码爱编程 (icode.best)

这里有个问题,如果这样做,这三个随机不是并行执行的吗,不会出现问题吗?? 

SV学习笔记—变量及数组随机化约束常犯的错误_Verification_White的博客-CSDN博客

4.使用uvm_do_on_with的时候也会调用pre randomize或者post radomize函数吗??? 

5.在uvm_do_on_with的时候如果使用同名变量进行约束随机的时候 ,需要考虑域的问题,建议使用local解决;

`uvm_do_with中constraint不生效的原因及解决方案_@constraint不生效的场景_城外南风起的博客-CSDN博客

这里引出一个问题,this和local,日后详细补。

6.约束冲突时:

(1)后来的约束覆盖前者约束(2)子类约束覆盖父类约束(3)外部约束覆盖内部约束

(4)强约束覆盖soft约束(5)如果两个soft 约束冲突,按上述3条处理且随机是可以成功

 7.使用 $urandom_range系统函数进行随机的时候,发现产生的数值与预期不符。原因可能是urandom_range随机范围上限是32 bit,上限数值max位宽很大的话只取低32 bit

8.

8.如何约束一个多位宽数据只有一个位宽数据为1:

 9.当修饰符为randc时,不要使用sovle…before…,因为randc默认最先计算,使用sovle…before…可能会带来未知错误。

10.子类会把父类中同名的约束覆盖。

sv 继承的同名constraint会覆盖_BlackDogv的博客-CSDN博客


http://www.niftyadmin.cn/n/5005828.html

相关文章

npm修改为国内镜像

npm config get registry 查看下载地址,默认是https://registry.npmjs.org/ 这是国外的地址,npm下载很慢 npm config set registry https://registry.npmmirror.com/ 使用此指令,修改为淘宝镜像,输入指令后检查是否修改成功 …

DataTableResponseEntity

/// <summary>/// DataTable数据集合返回实体/// </summary>[Serializable]public sealed class DataTableResponseEntity : IResponse{private readonly DataTable sourceTable;private readonly int PageCount;private readonly int totalCount;private readonly…

Jmeter性能测试手册

目录 目录 2 简介... 4JMeter与LoadRunner区别... 4环境配置... 5 3.1 安装JDK. 5 3.2 配置JDK环境变量... 9 3.3 安装并配置Maven. 13 3.4 下载JMeter 15 JMeter分类使用... 16 4.1 对于Dubbo类接口的测试.. 16 4.1.1 安装开发工具IDEA. 16 4.1.2 配置字符集格式…

【FPGA】通俗理解从VGA显示到HDMI显示

注&#xff1a;大部分参考内容来自“征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;” 贴个下载地址&#xff1a; 野火FPGA-Altera-EP4CE10征途开发板_核心板 — 野火产品资料下载中心 文档 hdmi显示器驱动设计与验证 — …

智能合约安全分析,Vyper 重入锁漏洞全路径分析

智能合约安全分析&#xff0c;Vyper 重入锁漏洞全路径分析 事件背景 7 月 30 日 21:10 至 7 月 31 日 06:00 链上发生大规模攻击事件&#xff0c;导致多个 Curve 池的资金损失。漏洞的根源都是由于特定版本的 Vyper 中出现的重入锁故障。 攻击分析 通过对链上交易数据初步分…

vue3中的reactive赋值问题

问题 当通过方法对reactive变量修改的时候&#xff0c;发现页面上的值没有及时更新&#xff1f; 解决方法 具体原因: 上面这样赋值检测不到&#xff0c;因为响应式的是它的属性&#xff0c;而不是它自身. 方法1: 单个赋值 如下&#xff1a; let obj reactive({name: zha…

集合的练习题

练习1&#xff1a;随机点名器 需求&#xff1a;班级里有N个学生&#xff0c;实现随机点名器 public class W1随机点名器 {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();Collections.addAll(list, "范闲", &quo…

【嵌入式数据库之sqlite3】

目录 一.数据库基本概念&#xff08;理解&#xff09; 1.数据 2.数据库 二.常用的数据的数据库&#xff08;了解&#xff09; 1.大型数据库 2.中型数据库 3.小型数据库 三.基于嵌入式的数据库&#xff08;了解&#xff09; 四.SQLite基础&#xff08;了解&#xff09;…