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之前有一些限制,下面列出了这些限制:

  1. 不允许使用randc变量,因为它们总是先被解决;
  2. 变量应该是整数值;
  3. 在这样的排序中不应该存在循环依赖,solve a before b combined with solve b before a。

SystemVerilog中的solve - before的用法详解相关推荐

  1. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  2. python中str和input_对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

  3. js数组中foEach和map的用法详解 jq中的$.each和$.map

    数组中foEach和map的用法详解 相同点: 1.都是循环遍历数组(仅仅是数组)中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项value, ...

  4. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  5. python3 isinstance用法_对python中assert、isinstance的用法详解

    1. assert 函数说明: Assert statements are a convenient way to insert debugging assertions into a program ...

  6. python中tile的用法_python3中numpy函数tile的用法详解

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  7. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

  8. python中seek(10、1)_Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...

  9. python中index什么意思_Python中index()和seek()的用法(详解)

    1.index() 一般用处是在序列中检索参数并返回第一次出现的索引,没找到就会报错,比如: >>> t=tuple('Allen') >>> t ('A', 'l ...

最新文章

  1. Unreal Engine 4 RenderTarget制作Live Camera效果
  2. BEM 实战之微信个人页面
  3. cornerstone 忽略不必要文件
  4. IE6使用png透明图片的方法
  5. macos安装盘第三方工具制作_一步一步教你为macOS创建系统安装盘
  6. 小程序突破五层限制的方法
  7. cmd命令不识别exp_GRAT2:一款功能强大的命令amp;控制(C2)工具
  8. [dotnet]以最小的成本,落地微服务特色的DevOps管道,持续集成/部署到kubernetes。...
  9. 由浅入深了解EventBus:(五)
  10. jQuery 版本升级迁移
  11. excel自动求和_Excel教程:3个按条件定位的小技巧
  12. 【Bugs】Hbase:File system needs to be upgraded. You have version null and I want version(habse缓冲问题)
  13. A40i nfs挂载问题
  14. Android 10(Q)GMS(cts/vts/gts)认证总结
  15. 人生没有白走的路,每一步都算数
  16. 棋牌游戏服务器开发心得
  17. Android知识点原理总结
  18. winmail的安装及使用说明流程
  19. 降低语速是需求评审最有价值的技巧
  20. 厨房java_【ROM制作】java环境配置,厨房安装

热门文章

  1. 小程序Promise用法
  2. Vue Router 组件内的守卫、导航解析流程
  3. CachedRowSet使用
  4. openfire运行ant命令控制台中文乱码问题
  5. 购买笔记本时候的注意事项
  6. 百度手机卫士,简单粗暴至极(关于Stagefright高危漏洞)
  7. AndroidStudio:refreshing vcs history
  8. 腾讯蓝鲸智云平台搭建
  9. 解决vscode中golang插件安装失败方法
  10. Select Distinct语句