首页 > 其他分享 >随机化方法

随机化方法

时间:2022-08-28 15:58:22浏览次数:47  
标签:pre 方法 void 随机化 RANDOMIZATION post randomize

受约束的随机验证提供了三种随机化的方法:

1. Randomize( )

2. Pre-randomize()

3. Post-randomize()

每个类都有一个内置的 randomize( ) 方法,它是一个虚函数,它为受约束的对象中的所有随机变量(rand 和 randc)生成随机值。

如果成功,则 randomize( ) 方法返回 1,否则返回 0,如下例所示。

sft sf;
sf = new( );
int success = sf.randomize( );
if (success == 1) …

应该始终测试 randomize() 的返回值。可以使用 assert(randomize()),但有时会全局关闭所有断言。在这种情况下,使用 if (randomize()) else $error(...);。当求解器失败时,一些工具会自动生成错误消息,但它不会停止模拟并且最终会得到一个未随机化的对象。

Pre-randomization and Post-randomization

在调用 randomize() 时,pre_randomize() 和 post_randomize() 分别在 randomize() 调用之前和之后被调用。用户可以覆盖这两种方法。 pre_randomize 函数可用于在对象随机化之前设置前置条件。 post_randomization 函数可用于在对象随机化后检查和执行后置条件。当 randomize() 被调用时,它首先调用 obj 上的 pre_randomize() 以及它所有被启用的随机对象成员。在计算和分配新的随机值之后,randomize() 调用 obj 上的 post_randomize() 以及它所有启用的随机对象成员。

请注意,randomize() 是内置的,不能被覆盖。

看一个例子,说明 pre_randomize() 和 post_randomize() 如何与子类一起工作。他们以什么顺序被调用?

class parent;
  function void pre_randomize;
    $display(" PARENT PRE_RANDOMIZATION ");
  endfunction
  function void post_randomize;
    $display(" PARENT POST_RANDOMIZATION ");
  endfunction
endclass
class Ex1 extends parent;
  function void pre_randomize;
    $display(" Ex1 PRE_RANDOMIZATION ");
  endfunction
  function void post_randomize;
    $display(" Ex1 POST_RANDOMIZATION ");
  endfunction
endclass
class Ex2 extends parent;
  function void pre_randomize;
    super.pre_randomize( ); //Call to super.
      $display(" Ex2 PRE_RANDOMIZATION ");
  endfunction
  function void post_randomize;
    super.post_randomize( ); //call to super.
    $display(" Ex2 POST_RANDOMIZATION ");
  endfunction
endclass
module TOP;
  parent P = new( );
  Ex1 E1 = new( );
  Ex2 E2 = new( );
  initial
    begin
      void'(P.randomize( ));
      void'(E1.randomize( ));
      void'(E2.randomize( ));
    end
endmodule

仿真结果

Compiler version S-2021.09; Runtime version S-2021.09;  Aug 28 03:30 2022
 PARENT PRE_RANDOMIZATION 
 PARENT POST_RANDOMIZATION 
 Ex1 PRE_RANDOMIZATION 
 Ex1 POST_RANDOMIZATION 
 PARENT PRE_RANDOMIZATION 
 Ex2 PRE_RANDOMIZATION 
 PARENT POST_RANDOMIZATION 
 Ex2 POST_RANDOMIZATION 
           V C S   S i m u l a t i o n   R e p o r t 

定义了三个类:“parent”类以及从“parent”扩展而来的“Ex1”和“Ex2”。每个类都有一个 pre_randomize( ) 和 post_randomize( ) 函数。请注意,“Ex2”首先在其 pre_randomize( ) 函数中调用 super.pre_randomize( )。同样,它也在其 post_randomize() 函数中首先调用 super.post_randomize()。 

 

如果一个类是派生类,并且派生类中不存在用户定义的 pre_randomize( ) 和 post_randomize( ) 实现,则 pre_randomize( ) 和 post_randomize( ) 将分别自动调用 super.pre_randomize( ) 和 super .post_randomize()。看一个例子:

class parent;
  function void pre_randomize;
    $display(" PARENT PRE_RANDOMIZATION ");
  endfunction
  function void post_randomize;
    $display(" PARENT POST_RANDOMIZATION ");
  endfunction
endclass
class Ex1 extends parent;
endclass
module TOP;
  Ex1 E1 = new();
  initial
    if (E1.randomize( )) $display ("PASS");
endmodule

仿真结果:

Compiler version S-2021.09; Runtime version S-2021.09;  Aug 28 03:40 2022
 PARENT PRE_RANDOMIZATION 
 PARENT POST_RANDOMIZATION 
PASS
           V C S   S i m u l a t i o n   R e p o r t 

“Ex1”类继承自“parent”类,但没有定义 pre_randomize( ) 或 post_randomize( ) 函数。因此,当 E1(它是“Ex1”类的实例)被随机化时,它首先调用其“父”类的预随机化和后随机化函数,后者依次执行其预随机化和后随机化函数。这显示在仿真日志中。

 请注意,预随机化和后随机化函数允许您对函数允许的任何功能进行建模。我只展示了 $display 来展示它们是如何被调用和锻炼的。但是您可以在随机化之前(pre)和随机化之后(post)拥有一个想要的有意义的功能。

 

标签:pre,方法,void,随机化,RANDOMIZATION,post,randomize
From: https://www.cnblogs.com/fuqiangblog/p/16632892.html

相关文章

  • 安装JDK出现"Windows Installer程序包有问题,此安装需要的DLL不能运行"解决方法
    安装JDK出现"WindowsInstaller程序包有问题,此安装需要的DLL不能运行"解决方法_turbomit的博客-CSDN博客_java此安装需要的dll不能运行 https://blog.csdn.net/u0136907......
  • [转]Python PEP8 代码规范常见问题及解决方法
    转自:https://blog.csdn.net/qq_36759224/article/details/89304878 Python的PEP8代码规范,将常见的PEP8代码规范问题和解决方法记录一下,学习一下,养成良好......
  • 记录一次网站上传的python代替方法
    网址:https://tool2-mml.sjtu.edu.cn/VRprofile/VRprofile.php这个网站需要上传文件 思路抓包看下网络请求开始看的时候发现没啥然后用wireshark看了下发现文件上传......
  • 关于vue的css样式对js动态添加的dom节点不生效问题的解决方法
    一、问题描述开发的时候免不了有时候需要向某个节点appendchild,添加子节点,但是如果是在vue中,就会发现通过操作dom的appendchild方式添加节点会出现样式对这些新增的节点......
  • ES6的class 中 constructor 方法
    ES6 的 class 属于一种“语法糖”,让写法更像面对对象的编程。functionAbc(x,y){this.x=x;this.y=y;}Abc.prototype.add=function(){retur......
  • IDEA配置方法注释
    之前配置过,但是忘记了,再次记录下.IDEA版本(IntelliJIDEA2019.3.1x64)类注释如下位置配置,创建类时自动生成注释.点击查看代码/***${NAME}**@author${......
  • IDEA 左侧显示/展开类中的方法
    原文链接:https://blog.csdn.net/qzc2017/article/details/1197290921点设置,勾选ShowMembers2或者Alt+7,调出Structure效果,会根据所选的类变动......
  • 查找导致cup过高的代码方法
    与 jstack实战死循环与死锁学习笔记 介绍的方法一致。使用top命令查看  top-p21919 线程进程号pid的内存情况   按H,获取每个线程的内存情况.PID为线程......
  • node-sass 安装出错常见解决方法
    使用与node-sass版本兼容的node到package.json中找到node-sass的版本号。使用nvm将node切换到与node-sass版本兼容的版本(sass/node-sass有版本对照表)。......
  • 缠论正确的食用方法
    ​缠论是一套技术分析理论,用于择时,给出股价在后续不同走势情况下的应对策略。那么该如何正确使用缠论呢?首先拿到一只股票,先看月线、周线,再看日线。股票只做趋势向......