SystemVerilog中的solve - before的用法详解
https://www.chipverify.com/systemverilog/systemverilog-solve-before
可以参考这个链接,英文版,讲解了很多SV的用法
可以类比概率论中的条件概率:条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B),读作“在B的条件下A的概率”。
solve-before的用法
solve A before B
简单点说,就是在解决B之前先解决A,可以改变概率的分布,使得某些特定的情况比其他情况更容易被选择。
随机分布实例
其中3位随机变量b可以具有8个合法值(2^3个组合)。 b被随机赋值所有可能值(0~7)的概率相同,都等于1/8。每次都是从0 ~ 7中随机选择,不管前一个数选择的是啥值,下一个数照样随机选择0 ~ 7中的任意一个值。
class ABC;rand bit [2:0] b;
endclassmodule tb;initial beginABC abc = new;for (int i = 0; i < 10; i++) beginabc.randomize();$display ("b=%0d", abc.b);endend
endmodule
运行结果:
不使用solve - before
a和b是一起确定的,不是一个接一个确定的
其中声明了两个随机变量。这个约束确保了当a = 1时,b = 0x3。当a为0时,b可以采用4个值中的任何一个。 因此,这里有4种组合。 接下来,当a为1时,b只能取1个值,因此只能有1个组合。因此,有5种可能的组合,并且如果约束求解器必须为每个分配均等的概率,则选择任何组合的概率为1/5。
class ABC;rand bit a;rand bit [1:0] b;constraint c_ab { a -> b == 3'h3; }
endclassmodule tb;initial beginABC abc = new;for (int i = 0; i < 8; i++) beginabc.randomize();$display ("a=%0d b=%0d", abc.a, abc.b);endend
endmodule
仿真结果:
统计表:
使用solve - before
SystemVerilog允许一种机制来对变量排序,以便a可以独立于b进行选择。这是通过使用solve关键字来完成的。
class ABC;rand bit a;rand bit [1:0] b;constraint c_ab { a -> b == 3'h3; //告诉求解者在尝试b之前必须先解出a,因此a的值决定了b的值//solve a before b;}
endclassmodule tb;initial beginABC abc = new;for (int i = 0; i < 8; i++) beginabc.randomize();$display ("a=%0d b=%0d", abc.a, abc.b);endend
endmodule
仿真结果:
统计表:
在这里,首先解决a,然后根据得到的b解决。因为a首先被求解,所以选择0或1的概率为50%。接下来,为b选择一个值的概率取决于为a选择的值。从表中可以看出,当a=0是,b无论选择啥值,Probability都非常的小,但是当a=1时,b=3的概率等于1/2。所以总体来说b=3的概率要大于1/2这么一丢丢。
限制
在使用Solve之前有一些限制,下面列出了这些限制:
- 不允许使用randc变量,因为它们总是先被解决;
- 变量应该是整数值;
- 在这样的排序中不应该存在循环依赖,solve a before b combined with solve b before a。
SystemVerilog中的solve - before的用法详解相关推荐
- python的raw_ input是什么意思-对python中raw_input()和input()的用法详解
最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...
- python中str和input_对python中raw_input()和input()的用法详解
最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...
- js数组中foEach和map的用法详解 jq中的$.each和$.map
数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...
- 教程-Delphi中Spcomm使用属性及用法详解
Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...
- python3 isinstance用法_对python中assert、isinstance的用法详解
1. assert 函数说明: Assert statements are a convenient way to insert debugging assertions into a program ...
- python中tile的用法_python3中numpy函数tile的用法详解
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...
- python中mat函数_Python中flatten( )函数及函数用法详解
flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...
- python中seek(10、1)_Python中index()和seek()的用法(详解)
1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...
- python中index什么意思_Python中index()和seek()的用法(详解)
1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...
最新文章
- Unreal Engine 4 RenderTarget制作Live Camera效果
- BEM 实战之微信个人页面
- cornerstone 忽略不必要文件
- IE6使用png透明图片的方法
- macos安装盘第三方工具制作_一步一步教你为macOS创建系统安装盘
- 小程序突破五层限制的方法
- cmd命令不识别exp_GRAT2:一款功能强大的命令amp;控制(C2)工具
- [dotnet]以最小的成本,落地微服务特色的DevOps管道,持续集成/部署到kubernetes。...
- 由浅入深了解EventBus:(五)
- jQuery 版本升级迁移
- excel自动求和_Excel教程:3个按条件定位的小技巧
- 【Bugs】Hbase:File system needs to be upgraded. You have version null and I want version(habse缓冲问题)
- A40i nfs挂载问题
- Android 10(Q)GMS(cts/vts/gts)认证总结
- 人生没有白走的路,每一步都算数
- 棋牌游戏服务器开发心得
- Android知识点原理总结
- winmail的安装及使用说明流程
- 降低语速是需求评审最有价值的技巧
- 厨房java_【ROM制作】java环境配置,厨房安装