UVM中Callback机制

Callback机制,其实是使用OOP来实现的一种程序开发者向程序使用者提供的模块内部的接口。可以在Test_case的高度改变其他component的一些行为。

Systemverilog中已经提供的Callback函数pre_randomize,post_randomize。对于UVM和VIP来说,其他的CallBack函数都是自己程序的开发者事先

留下的hook。

Callback的实现:

1)首先直接从component扩展出新的类来实现pre_do等function不可取。因为component的改变会让整个UVM的tree改变。

2)考虑利用OOP的composition来操作,先定义一个类A,并定义virtual pre_do等function于它的类中。后在UVM的component中加入该类,在do函数

之前调用pre_do。这样在未重定义时,由于pre_do中没有任何操作,所以不会对component产生任何影响。而重定义virtual pre_do之后,自然便

加入了相关的执行代码。

UVM和VIP中的实现:

首先字uvm_callback派生一个类A,并定义虚函数virtual pre_do;(或uvm_reg_cbs

定义uvm_register_cb(driver, A);在driver类中。这样相当于将A加入driver class中。

定义A_pool,来存放A的实例化对象,在driver类中可以直接判断A_pool是否为空,来执行pre_do。

在driver类中,使用uvm_do_callbacks(driver, A, pre_do);来调用pre_do,在do函数之前。

这样便完成了预留的hook,

用户使用时:

接下来只需要在需要的时候extended A,定义好pre_do函数。并且在connect_phase之前调用add函数,来添加进来。

A_pool::add(env.i_agt.drv, cb);  cb即为A的Extended的类的对象。

时间: 2024-10-13 20:30:18

UVM中Callback机制的相关文章

UVM:9.1.3 UVN 中callback 机制的原理

1.如下的 callback: 1)假设这是一个城市的VIP 的driver,pre_tran 应该是my_driver 的一个函数,要callback pre_tran.factory可以,但这里不考虑. 2.新引入一个类: 1)可以避免重新定义一次my_driver,只需要重新定义A的pre_tran.重新派生A 的代价远小于my_driver. 3.使用的时候,只要从A 派生一个类并将其例化,然后重新定义pre_tran 函数,callback 目的就达到了. 1)但却忽略了一点.my_d

UVM中factory机制的使用

UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因为virtual可以控制选择sequence,sequence的启动,执行顺序等. 在build_phase阶段,不需要改变default_sequence,不需要改变别处代码. Transaction的重载,可以在不改变sequence,default_sequence的情况下,改变Transac

Android中callback(接口回调)机制

事实上,callback 机制在Android 中无处不在,特别是以Handler.Callback.Listener这三个词结尾的,都是利用callback机制来实现的.比方点击事件onClickListener就是一个已经封装好的callback案例: tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub

android中的Handler和Callback机制

android中的Handler和Callback机制 - - ITeye技术网站 Handler主要用来在线程之间的通信的机制.如在Activity或Service中需要接受其他线程的消息,则在需要接收消息的Activity或Service中需要实现Handler.Callback接口,实现这个接口的: Java代码 ? public?boolean?handleMessage(?Message?inMessage?)?:?? public boolean handleMessage( Mes

UVM中的class

UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告(reporting)--------uvm_report_object/uvm_report_handler/uvm_report_server/uvm_report_catcher Factory---------uvm_*_register/uvm_factory 配置(config)----

UVM的factory机制

在UVM中使用工厂模式基本上分为三个步骤: 1. 注册 当定义一个类的时候,它的类型必须要注册,UVM已经提供了专用的宏. `uvm_component_utils(class_type_name) `uvm_component_param_utils(class_type_name #(params)) `uvm_object_utils(class_type_name) `uvm_object_param_utils(class_type_name #(params)) 这四个宏中两个是为参

UVM中的regmodel建模(一)

UVM中的regmodel继承自VMM的RAL(Register Abstract Layer),现在可以先将寄存器模型进行XML建模,再通过Synopsys 家的工具ralgen来直接生成regmodel,提供后门访问,十分方便. 寄存器模型建模: 1)定义一个寄存器,如下;也可以在该class中定义covergroup,sample的function等.在以后的component中在采样. class  reg_invert  extends uvm_reg; rand  uvm_reg_f

JavaScript中事件处理机制

JavaScript中事件处理机制 JavaScript中代码的处理方式:单线程 + 事件队列(callback queue) :如果是纯单线程的话,js代码在执行的时候遇到耗时的操作,代码就会发生阻塞:利用事件队列的方式,代码在执行的时候会将回调函数放在事件队列中(callback queue),等主线程的任务执行完毕之后,执行event loop机制的线程会将满足执行条件的任务取出来(注意需要满足的两个前提条件:一:主线程的任务已经执行完毕:二:事件队列中的任务满足触发条件),放入主线程中进

js中callback.call()和callback()的区别

js中callback.call()和callback()的区别在js中callback.call()和callback() 有什么区别,举个例子:function a(){alert('hello!');}function b(callback){callback();}function c(callback){callback.call();}function test(){b(a);c(a);}在test函数中,b和c的效果是一样的,都执行了回调函数a.这两种用法有什么区别呢? -----