第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 20res = bus.randomize() with {10 <= addr && addr <= 20;};// EXAMPLE 3: restrict data values to powers-of-twores = 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 constraintbus.word_align.constraint_mode(1);// 打开
endtask 

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

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

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

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

class XYPair;
rand integer x, y;
endclassclass 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);endfunctionendclass 

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

三  随机变量

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

探索PickleDB:Python中的轻量级数据存储利器

文章目录 探索PickleDB&#xff1a;Python中的轻量级数据存储利器1. 背景&#xff1a;为什么选择PickleDB&#xff1f;2. PickleDB是什么&#xff1f;3. 如何安装PickleDB&#xff1f;4. 简单的库函数使用方法创建和打开数据库设置数据获取数据删除数据保存数据库 5. 应用场景与…

PPT文件设置了修改权限,如何取消权?

不知道大家在使用PPT文件的时候&#xff0c;是否遇到过下面的提示框&#xff0c;这就是PPT文件设置了修改权限&#xff0c;只有输入密码才可以编辑文件。 如果我们没有输入密码&#xff0c;以只读方式进入&#xff0c;那么我们会发现功能栏中的按钮全是灰色&#xff0c;无法使用…

【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)

本文接上篇Fiddler介绍&#xff0c;开始讲fiddler如何使用之前&#xff0c;给大家讲讲http以及web方面的小知识&#xff0c;方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…

健身房管理新纪元:SpringBoot技术应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

vue3 ref,shallowRef,reactive,shallowReactive使用的简单异同点说明

1、这几个都是负责data的存储及读取的&#xff0c;我们常用的是ref,reactive。 2、看一下shallowRef这个,shallowReactive与其类似。 说明&#xff1a;以官网的说明&#xff0c;这个state.value.count 2是不会触发视图更新的&#xff0c;但是如果直接在<script setup lang…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

分分钟让你了解Web接口测试!

01 什么是接口 百度说&#xff1a;接口泛指实体把自己提供给外界的一种抽象化物&#xff08;可以为另一实体&#xff09;&#xff0c;用以由内部操作分离出外部沟通方法&#xff0c;使其能被内部修改而不影响外界其他实体与其交互的方式 上面这句有点抽象&#xff0c;网上的资…

Java8新特性/java

1.lambda表达式 区别于js的箭头函数&#xff0c;python、cpp的lambda表达式&#xff0c;java8的lambda是一个匿名函数&#xff0c;java8运行把函数作为参数传递进方法中。 语法格式 (parameters) -> expression 或 (parameters...) ->{ statements; }实战 替代匿名内部类…

如何在 uniapp 中实现图形验证码

全篇大概2000 字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间10分钟。 什么是图形验证码&#xff1f; 图形验证码&#xff08;也称为图片验证码或验证码图像&#xff09;通常用于防止机器人自动提交表单&#xff0c;确保用户是人工操作。 一、需求 我们希望在一个…

基于 Java(SpringBoot)+MySQL 开发古诗词学习网站

古诗词系统设计与实现 引言 编写目的 为了保证项目团队按时保质地完成项目目标&#xff0c;便于项目团队成员更好地了解项目情况&#xff0c;使项目工作开展的各个过程合理有序&#xff0c;有必要以文件化的形式&#xff0c;把对于在项目生命周期内的工作任务范围、各项工作…

基于JavaWeb+MySQL实现口算题卡

爱 math 口算题卡 1. 总体要求 综合运用软件工程的思想&#xff0c;协同完成一个软件项目的开发&#xff0c;掌软件工程相关的技术和方法&#xff1b;组成小组进行选题&#xff0c;通过调研完成项目的需求分析&#xff0c;并详细说明小组成员的分工、项目的时间管理等方面。根…

Sibyl:提升复杂现实世界推理能力的LLM智能体框架

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;以其卓越的问题解决能力而闻名&#xff0c;这主要归功于它们内在的知识储备、强大的上下文学习能力以及零样本&#xff08;zero-shot&#xff09;能力。然而&#xff0c;这些基于LLM的智能体在长期推…

Jest项目实战(4):将工具库顺利迁移到GitHub的完整指南

开源代码&#xff1a;将工具库迁移到GitHub 随着项目的成熟和完善&#xff0c;将其开源不仅可以获得更多的用户和贡献者&#xff0c;还能促进项目本身的发展。GitHub作为全球最大的开源协作平台&#xff0c;自然成为了大多数开发者的首选。本文将引导您完成将工具库迁移至GitH…

ai面试辅助工具有哪些

目前市场上常见的AI面试辅助工具包括以下几款‌&#xff1a; ‌白瓜面试‌&#xff1a;这是一款专为在线面试和笔试场景设计的AI助手&#xff0c;支持实时语音识别、图片识别、智能辅助回答等功能&#xff0c;适用于多种岗位和面试平台‌ ‌Interview‌&#xff1a;这是一款基…

Redis - Zset 有序集合

一、基本认识 有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数&#xff08;score&#xff09;与之关 联&#xff0c;着使得有序集合中…

Linux下的WatchDog

看门狗&#x1f415; 看门狗简介 看门狗定时器&#xff08;Watchdog Timer&#xff09;是一种定时器&#xff0c;用于检测系统是否正常运行。如果系统在规定时间内没有向看门狗定时器发送复位信号&#xff0c;看门狗定时器就会产生复位信号&#xff0c;使系统复位。看门狗定时…

vue3+vite搭建脚手架项目本地运行electron桌面应用

1.搭建脚手架项目 搭建Vue3ViteTs脚手架-CSDN博客 2.创建完项目后&#xff0c;安装所需依赖包 npm i vite-plugin-electron electron26.1.0 3.根目录下创建electron/main.ts electron/main.ts /** electron/main.ts */import { app, BrowserWindow } from "electron&qu…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

H7-TOOL的LUA小程序教程第17期:扩展驱动AD7606, ADS1256,MCP3421, 8路继电器和5路DS18B20(2024-11-01)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…