UVM的callback的使用(八)

本文介绍了UVM中回调(callback)机制的基本概念及其应用场景。通过一个具体的示例——Mii_driver类中的pre_tran回调函数,详细解释了如何在验证环境中利用回调来增强组件之间的交互性和复用性。此外,还提到了如何创建自定义的回调类来扩展验证平台的功能。

Callback的使用:
作用:提高验证平台的复用性。
UVM中的callback的使用方法:
例子:只涉及到一个类,Mac_transaction。
Task mii_driver::main_phase();
…….
While(1) begin
Seq_item_port.get_next_item(req);
`uvm_do_callbacks(mii_driver,A,pre_tran(this,req))
………
End
Endtask

Uvm_do_callback宏的第一个参数是调用pre_tran的类的名字,第二个参数是指哪个类具有pre_tran,第三个参数是调用的是哪个函数(任务),在指明pre_tran时,要顺便给出pre_tran的参数。

类A的定义:
Class A extends uvm_callback;
Virtual task pre_tran(mii_driver mii_drv,ref mii_transaction tr);
Endtask
Endclass

建立新的测试用例,只需从A中派生一个类。
这里写图片描述

其次,在base_test中把my_callback实例化:
这里写图片描述

UVM callback机制是UVM验证平台中的重要特性,其定义、作用、使用步骤及意义如下: ### 定义 对于环境开发者预知部分功能在将来会存在多种使用场景,需要在环境中预留一个可扩展的hook,相当于针对部分功能函数或任务进行override。不同于继承,callback机制可以实现对局部的方法进行精准扩展[^4]。 ### 作用 Callback机制在UVM验证平台最大用处是提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前或之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例[^3]。 ### 使用步骤 1. 在UVM组件中内嵌callback函数或任务。 2. 声明一个UVM callback空壳类。 3. 从UVM callback空壳类中扩展UVM callback类。 4. 在验证环境中创建并登记UVM callback实例[^2]。 ### 代码示例 以下是一个简单的UVM callback机制示例代码: ```systemverilog import uvm_pkg::*; `include "uvm_macros.svh" // 1. 在UVM组件中内嵌callback函数 class my_component extends uvm_component; `uvm_component_utils(my_component) function new(string name, uvm_component parent); super.new(name, parent); endfunction function void pre_run_phase(uvm_phase phase); // 调用callback if (uvm_callbacks#(my_component, my_callback).do_callback(this, "pre_run_callback")) begin `uvm_info("MY_COMPONENT", "Callback executed in pre_run_phase", UVM_LOW) end endfunction endclass // 2. 声明一个UVM callback空壳类 class my_callback extends uvm_callback; `uvm_object_utils(my_callback) function new(string name = ""); super.new(name); endfunction // 3. 从UVM callback空壳类中扩展UVM callback类 virtual function bit pre_run_callback(my_component comp); return 1; endfunction endclass // 4. 在验证环境中创建并登记UVM callback实例 module tb; initial begin my_component comp; my_callback cb; comp = my_component::type_id::create("comp", null); cb = my_callback::type_id::create("cb"); // 登记callback uvm_callbacks#(my_component, my_callback).add(comp, cb); run_test(); end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南国之邱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值