【IC验证】随机约束

devtools/2024/10/15 21:57:01/

1.约束

(1)注意
一般随机约束只能在类中使用;

(2)实现步骤
在定义变量时,用rand/randc关键字进行修饰
定义约束;
创建并实例化类后,调用随机约束方法;
(3)常见的约束
A 双向约束
a 说明:约束块之间是并行的,约束语句之间也是并行;
b 例子:

class randomize_test;rand bit [31:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{src >10;src <15;}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize();$display("After randomize");p.print();end
endmodule

c结果:
src的取值范围是10<src<15
B 内嵌约束
a 说明:
限制变量取值范围;
语法:
方法一:在约束块中:
成员变量 inside 取值范围;
方法二:
实例化随机约束句柄.randmize() with {}
b 例子
例子1:

class randomize_test;rand bit [31:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{src inside {[1:5],[7:8]};}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize();$display("After randomize");p.print();end
endmodule

例子2:

class randomize_test;rand bit [31:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{src inside {[1:5],[7:8]};}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize() with { 5<src;};$display("After randomize");p.print();end
endmodule

c 结果
例子一:
在这里插入图片描述
例子二:
在这里插入图片描述
C 权重约束
a 说明:
约束每个值分配的权重
语法:
变量名 dist {值:=每个值分配权重,值:/共同分配的权值};
b 例子

class randomize_test;rand bit [31:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{src dist {[1:3]:/1,[7:8]:=2,10:=5};}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize();$display("After randomize");p.print();end
endmodule

c 结果
权重分配情况:
1,2,3共同分配1的权重,即每个对应1/3;
7,8每个分配的权重为2;
10分配的权重为5;
D 唯一标识约束
a 说明
声明后,约束的变量取值不会重复;
语法:
unique {多个成员变量};
b 例子

class randomize_test;rand bit [1:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{unique {src,dst};}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize();$display("After randomize");p.print();end
endmodule

c 结果
在这里插入图片描述
E 条件约束
a 说明
如果条件满足,约束要满足;
语法:
方法一:
条件 -> 约束;
方法二:
if(条件1)
约束1;
else if(条件2)
约束2;
else
约束3;
b 例子
在这里插入图片描述
F 动态数组的长度约束
a 说明
约束动态数组的长度;
语法:
动态数组名.size() 约束;//可以使用各种约束,比如取值范围约束
b 例子

class randomize_test;rand bit [31:0] src,dst,data[];rand bit [7:0] kind;constraint cstr{data.size < 5;}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize();$display("After randomize");p.print();end
endmodule

c 结果
在这里插入图片描述
H 软约束
a 说明
当多个约束冲突时,可以用soft关键字修饰(soft表示软约束,默认是硬约束),当软约束和硬约束冲突时会优先执行硬约束;
一般:底层约束用soft关键字修饰,额外的约束用硬约束;
注意:
soft关键字修饰的是约束语句,不是约束块;
硬约束和硬约束冲突时,约束失败;
硬约束和软约束冲突时,执行硬约束;
软约束和软约束冲突时,会就近执行;(后写的:with额外约束 -> 子类约束 ->父类约束)
b 例子

class randomize_test;rand bit [31:0] src,dst,data[4];rand bit [7:0] kind;constraint cstr{soft src inside {[1:5]};}function void print();$display("src is %0d\n dst is %0d\n kind is %0d\n data is %p",src,dst,kind,data);endfunction
endclass
module tb;randomize_test p;initial beginp = new();$display("Before randomize");p.print();p.randomize() with{src inside {[6:10]};};$display("After randomize");p.print();end
endmodule

c 结果
在这里插入图片描述


http://www.ppmy.cn/devtools/126368.html

相关文章

浅谈C++之日志记录

在 C 中使用 log4net 进行日志记录&#xff0c;您需要遵循以下步骤&#xff1a; 安装 log4net&#xff1a; 首先&#xff0c;您需要在您的 .NET 项目中包含 log4net 库。通常&#xff0c;这可以通过 NuGet 包管理器来完成。 配置 log4net&#xff1a; 您需要创建一个配置文件…

发布-订阅模式(Publisher-Subscriber)

实际上&#xff0c;发布-订阅模式只是观察者模式的一个别称。 但是经过时间的沉淀&#xff0c;似乎他已经强大了起来&#xff0c;已经独立于观察者模式&#xff0c;成为另外一种不同的设计模式。在现在的发布订阅模式中&#xff0c;称为发布者的消息发送者不会将消息直接发送给…

python对weedfs的操作

1、weedfs的简介 如果你对weed储存有一定的理解也可以忽略 WeedFS&#xff08;Weed File System&#xff09;是一个开源的分布式文件系统&#xff0c;由Go语言编写&#xff0c;旨在解决海量文件存储和访问的问题。它采用了类似于Hadoop HDFS的分布式文件系统架构&#xff0c;…

【微服务】微服务注册:构建灵活的服务管理机制

目录 引言一、什么是微服务注册&#xff1f;1.1 服务注册中心的作用1.2 服务注册中心的工作原理1.3 示意图 二、常见的微服务注册中心2.1 各注册中心详细对比 三、微服务注册的实现方式3.1 Spring Cloud Netflix Eureka3.2 Consul3.3 Zookeeper3.4 etcd 四、微服务注册的注意事…

mysql存储过程

1、创建 CREATE DEFINERrootlocalhost PROCEDURE card.init_card(IN orgId bigint(20)) begin DECLARE card_user_id,if_has_org bigInt; //定义变量 END 2、入参出参 in、out 3、定义变量并且赋值 3.1、方法1 3.2、方法二 4、if语句&#xff0c;并且抛出异常 如果是为…

Android JNI调用.c文件

Android JNI调用.c文件 1.创建Android项目,创建一个jni目录来存放.c代码 2.CMakeLists.txt cmake_minimum_required(VERSION 3.10.2) project("MyApplication")add_library(native-lib SHARED native-lib.c)find_library(log-lib log)target_link_libraries

vue使用table实现动态数据报表(行合并)

<template><div class"previewTable"><h2>***项目研发数据报告</h2><table id"previewTable" width"100%"><tr><th>项目名称</th><td colspan"6">{{ resultData.proName }}<…

springboot+vue家政服务管理平台

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…