第18篇 :关于SystemVerilog中的约束随机机制(一)

一  概要

与传统的定向测试相比,随机测试可能更为有效。通过指定约束条件,用户可以轻松创建能够发现难以触及的边界情况的测试。SystemVerilog允许用户以简洁、声明式的方式指定约束条件。然后,这些约束条件会由一个求解器进行处理,该求解器会生成满足约束条件的随机值。

随机约束,通常是在面向对象的数据抽象之上指定的(这里的意思,通常对于面向对象的类对象而言)。该抽象,是通过将待随机化的数据建模为包含随机变量和用户定义约束的对象而实现。这些约束决定了可以分配给随机变量的合法值。该类方法,非常适合表示复杂的聚合数据类型和协议,如以太网数据包。

后面的章节,将会详细讲解关于随机变量、约束块以及用于操作它们的机制。

二  使用规则

 SystemVerilog采用面向对象的方法为对象的成员变量分配随机值,同时遵循用户定义的约束条件。

例如:在SystemVerilog中,你可以定义一个类,并为这个类的成员变量指定随机值。这些随机值可以受到一些约束条件的限制,以确保生成的随机数据符合特定的测试需求或设计规格。

 规则1 : 约束变量和变量控制

下面是一个简单的例子:

class Bus;
   rand bit[15:0] addr;
   rand bit[31:0] data;
   constraint word_align {addr[1:0] == 2'b0;} // 对地址 addr 的低位 进行约束
endclass 
Bus bus = new;
repeat (50) begin 
if ( bus.randomize() == 1 )  // randomize 成功,返回值为 1; 否则为 0
   $display ("addr = %16h data = %h\n", bus.addr, bus.data);
else 
   $display ("Randomization failed.\n");
end 

 注意:

1. 这里,如果 bus.randomize() 随机失败,将会执行else 分支,但是不会仿真停止;

2. 这里,与求解器失败场景不一样,如果是约束求解器求解失败,将会遇到编译错误

3. 这里,仅对addr 进行了约束,而 data没有,那么data 将会取值声明范围内的任意数值

 规则2 : 约束遵从继承

typedef enum {low, mid, high} AddrType;

class MyBus extends Bus;  // 随机变量及其约束控制,均可继承
  rand AddrType atype;
  constraint addr_range {
     (atype == low ) -> addr inside { [0 : 15] };
     (atype == mid ) -> addr inside { [16 : 127]};
     (atype == high) -> addr inside {[128 : 255]};
  }
endclass 

规则3 : randomize with 结构

task exercise_bus (MyBus bus);
  int res;
  // EXAMPLE 1: restrict to low addresses 
  res = bus.randomize() with {atype == low;}; 
  // EXAMPLE 2: restrict to address between 10 and 20
  res = bus.randomize() with {10 <= addr && addr <= 20;};
  // EXAMPLE 3: restrict data values to powers-of-two
  res = bus.randomize() with {(data & (data - 1)) == 0;};
endtask 

规则4 : 约束几个重要特性

具体如下:

— 约束可以是包含整型变量和常量的任何SystemVerilog表达式(例如,bit、reg、logic、integer、enum、packed struct)。

— 约束求解器能够处理广泛的方程,如代数因式分解、复杂布尔表达式以及混合整数和位表达式。在之前的例子中,2的幂约束是以算术方式表达的。它也可以使用移位运算符来表达,例如1 << n,其中n是一个5位的随机变量。

— 如果存在解,约束求解器将找到它。求解器只有在问题过度约束且没有随机值组合能满足约束时才会失败。

— 约束是双向交互的。在这个例子中,为addr选择的值取决于atype及其约束方式,而为atype选择的值则取决于addr及其约束方式。所有表达式运算符都是双向处理的,包括蕴含运算符(->)。

— 约束仅支持2态值。4态值(X或Z)或4态运算符(例如,===、!==)是非法的,并会导致错误。

规则5 : 约束block功能的禁用

task exercise_illegal(MyBus bus, int cycles);
   int res;

   // Disable word alignment constraint.
   bus.word_align.constraint_mode(0); // 禁用

   repeat (cycles) begin 
      // CASE 1: restrict to small addresses.
      res = bus.randomize() with {addr[0] || addr[1];};
   ...
   end
 
   // Reenable word alignment constraint
   bus.word_align.constraint_mode(1);// 打开
endtask 

规则6 : 约束变量功能的禁用

变量的属性 rand_mode() 可以对变量启用和禁用随机功能。禁用后,像其它非随机变量表现的一样。

规则7 : 内置 pre_randomize()post_randomize() 函数

有时候,我们希望在随机化之前或之后立即执行某些操作。这是通过两个内置方法pre_randomize()post_randomize()来实现的,它们分别在随机化之前和之后自动被调用。这些方法可以被覆盖以实现所需的功能。

class XYPair;
rand integer x, y;
endclass

 
class MyXYPair extends XYPair 

  function void pre_randomize();
    super.pre_randomize(); 
    $display("Before randomize x=%0d, y=%0d", x, y);
  endfunction 

  function void post_randomize();
    super.post_randomize();
    $display("After randomize x=%0d, y=%0d", x, y);
  endfunction
 
endclass 

默认情况下,pre_randomize() 和 post_randomize() 会调用它们被重写时的基类方法。当重写 pre_randomize() 或 post_randomize() 时,必须小心调用基类的这些方法,除非该类是基类(即没有父类)。否则,基类的这些方法将不会被调用。

三  随机变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910607.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面解析谷歌浏览器的功能与使用技巧

谷歌浏览器&#xff08;Google Chrome&#xff09;作为全球最受欢迎的网页浏览器之一&#xff0c;以其简洁的界面、快速的加载速度和强大的功能赢得了广大用户的青睐。本文将全面解析谷歌浏览器的功能和使用技巧&#xff0c;帮助您更好地利用这一工具提升上网体验。&#xff08…

《探索Zynq MPSoC》学习笔记(二)

引言&#xff1a;本文开始学习第二章内容&#xff0c;本文重点介绍FPGA、Zynq和Zynq MPSoC器件技术演进以及Zynq和Zynq MPSoC器件的基本结构和特点。 第二章 FPGA、Zynq和Zynq MPSoC &#xff08;1&#xff09; Zynq MPSoC是Xilinx发布的第一款SoC Zynq-7000片上系统&#xf…

mac 本地docker-mysql主从复制部署

mac 本地docker-mysql主从复制部署,服务器同理 1.本地docker启动两个mysql服务.端口号不一样 没有选择挂载到宿主机.只做测试用. 只是端口号不一样容器删掉.就没有数据了. 生产测试,需要挂在 master docker run -d --name mysql-slave -p 3308:3306 \ -e MYSQL_ROOT_PASSWORD…

七.numpy模块

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliphant…

测试用例小锦囊——基于思维导图的测试用例生成和维护

敲黑板&#xff0c;测试用例真的很重要&#xff01; 测试用例是测试工作的基础&#xff0c;通过提供结构化和系统化的方法&#xff0c;来帮助验证软件产品的功能是否按预期正确实现&#xff0c;从而确保软件质量&#xff0c;提升用户满意度。 测试用例的关键要素包括用例编号、…

Linux网络命令:用于查看和修改路由表的重要工具ip route 详解

目录 一、概述 二、用法 1、基本语法 2、参数说明 3、常用选项 4、获取帮助 三、基本用法示例 1、 查看路由表 2、 添加路由 3、 删除路由 4、 修改路由 5、 添加默认路由 6、 删除默认路由 四、路由表管理 1、查看所有路由表 2、指定路由表 五、其他选项 1、…

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

银行信贷风控专题&#xff1a;Python、R 语言机器学习数据挖掘应用实例合集&#xff1a;xgboost、决策树、随机森林、贝叶斯等 原创 拓端研究室 全文链接&#xff1a;https://tecdat.cn/?p38026 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘…

容器内pip安装Apache Airflow的经历:如何重置初始密码

背景 Apache Airflow™https://github.com/apache/airflow 是一个开源平台&#xff0c;用于开发、调度和监控面向批处理的工作流程。Airflow 可扩展的 Python 框架使您能够构建几乎可以连接任何技术的工作流程。Web 界面有助于管理工作流程的状态。Airflow 可以通过多种方式部…

RHCE作业四

一要求&#xff1a; 1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 二操作&#xff1a; 主服务器 1.安装 2主配置真反向 3正反设置 区域 1安装 2添加allow-transfer 3增量 4重启 Systemctl …

算法练习:1658. 将 x 减到 0 的最小操作数

题目链接&#xff1a;1658. 将 x 减到 0 的最小操作数 这道题目的意思就是&#xff0c;给定一个整数数组&#xff0c;和一个x&#xff0c;只能从数组最左边或者最右边进行删除&#xff0c;使得x恰好等于0&#xff0c;并且要操作次数最少的情况&#xff0c;否则返回-1. 这道题直…

职场如雷场,稍有不慎就会被炸翻?十大生存法则送给你

大多数人的一生都要经历过&#xff1a;求学&#xff0c;入职&#xff0c;退休三个阶段。其中职场生涯一般都在30至40年左右&#xff0c;占据了人生的大部分时间&#xff0c;而这段时间&#xff0c;是每个人最年富力强&#xff0c;精力充沛的时光。 那么&#xff0c;如何把这人…

这款神器,运维绝杀 !!!

项目简介 CrowdSec 是一款开源的、基于社区协作的网络安全防护工具&#xff0c;它通过分析和共享IP信誉数据来对抗恶意行为。该软件不仅支持IPv6&#xff0c;而且相较于传统的Python实现&#xff0c;其采用Go语言编写&#xff0c;运行速度提升了60倍。CrowdSec 利用Grok模式解析…

[C++] cpphttplib使用https而不是http

前言 首先我们假设是直接使用 httplib.h 的源文件。 支持 https 根据readme来看&#xff0c;需要开启一个宏&#xff0c;链接libssl和libcrypto就可以了。 下载openssl 保姆级OpenSSL下载及安装教程 选择非light的版本&#xff0c;这样才会有头文件和lib库引入文件。 编写C…

gitee 使用 webhoot 触发 Jenkins 自动构建

一、插件下载和配置 Manage Jenkins>Plugin Manager 搜索 gitee 进行安装 插件配置 1、前往Jenkins -> Manage Jenkins -> System -> Gitee Configuration -> Gitee connections 2、在 Connection name 中输入 Gitee 或者你想要的名字 3、Gitee host URL 中…

MDC(重要)

1.简介 MDC 介绍​ MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可以被同一…

Linux—进程学习-01

目录 Linux—进程学习—11.冯诺依曼体系结构2.操作系统2.1操作系统的概念2.2操作系统的目的2.3如何理解管理2.4计算机软硬件体系的理解2.5系统调用和库函数的概念 3.进程3.1进程是什么3.2管理进程3.2.1描述进程-PCB3.2.2组织进程3.2.3总结 3.3查看进程 4.与进程有关的系统调用 …

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

Redis常见面试题(二)

Redis性能优化 Redis性能测试 阿里Redis性能优化 使用批量操作减少网络传输 Redis命令执行步骤&#xff1a;1、发送命令&#xff1b;2、命令排队&#xff1b;3、命令执行&#xff1b;4、返回结果。其中 1 与 4 消耗时间 --> Round Trip Time&#xff08;RTT&#xff0c;…

Scala学习记录,List

List是一个不可变&#xff08;immutable&#xff09;的序列。特点&#xff1a;数据是有序的 前面学习的Set&#xff0c;Map数据是无序的&#xff1b;Array是有序的&#xff0c;Array数组物理空间上是连续的 List可变不可变&#xff1a; list中不可变的列表是不能修改的 list…

【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目

给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 示例 1&#xff1a; 输入&#xff1a;s "abciiidef", k 3 输出&#xff1a;3 解释&#xff1a…