10.12 AVM随机激励生成器
AVM 库中包含了一个有效组件avm_random_stimulus,可以用于生成随机事务流。
通过avm_random_stimuls以事务类型为参数的类的实例对象可以被生成。这个组件包含了avm_blocking_put_port 的端口,这个端口可以用于发送生成的事务。由于这是个阻塞端口,它使用阻塞的put函数来发送事务。
这个组件的核心是generate_stimulus()任务。该任务有两个参数,一个是被随机的事务对象,另一个是生成事务的数量。在缺省情况下,随机事务的类型为avm_transaction。激励生成器的假设条件为无论需要生成的类的事务类型是什么,该事务都由avm_transcation派生而来。如果生成事务的数量为0,在缺省条件下,激励生成器会无限次运行直到用户通过调用stop_stimulus_generation()通知它停止。stop_stimulus_generation()会把m_stop设为1。
在循环程序中每次通过调用t.randmoize()生成随机的事务。调用t.randmoize()会让所有的随机区域得到新的随机值。新的随机值会按照在事务类中定义的约束生成。同时,循环过程中会产生一个事务的克隆对象。这个克隆对象除了被分配新的内存之外,其他都是原始对象的完整副本。clone()这个函数在avm_ transaction基类中是个虚拟函数,在继承的随机类的实例对象中也必须要实例化。clone()函数进行新的内存分配,把从调用它的对象中得到的内容复制到新的内存空间上,并返回一个控制句柄。最终,在循环程序中,使用阻塞的put函数送出随机的克隆事务到测试数据流中。
第一次看到generate_stimulus()会觉得有点奇怪,它使用随机的对象作为参数。avm_random_stimulus 组件以随机事务对象的类型来参数化。那么为什么还要对avm_random_stimuls重新定义?是的,这里没有其他的选择。缺省时 t 参数为空。构造函数用于生成新的trans_type的对象。然而,如果 t 是非空的,那么传入的对象是随机的对象(不需要生成一个新的随机对象)。这种处理方式支持把trans_type的派生类传到generate_stimulus()。trans_type派生类的对象可能与基类有不同的约束条件。这是一个简单但有效的方法,让avm_random_stimuls的实例对象能生成任何派生类的对象。这种方法可以用于修改约束或生成多态对象的实例对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。