[UVM源代码研究] 聊聊UVM中的callback机制

UVM Callback机制解析

1. callback机制是什么?

以最高效的方式完成芯片验证,一直以来都是验证人员的首要目标,那么最直接的方式就是环境的移植和重用,一个优秀的验证工程师,在开发环境的过程中,一定会考虑环境的继承和重用。
继承(extend)这个我们在实际工作中经常使用,主要是为了在原有功能的基础上扩展一些新的功能,比如我们的testcase一般都是从一个base_test继承而来的,如果继续将testcase继续细分,又会产生一些中间的function_base_test,主要目的是为了将一些公共的功能属性抽取出来提炼成公共的变量或方法供所有相关的testcase继承使用,这便是“继承”在环境复用时的主要用途。
除了继承,UVM还提供了一个callback机制,他的主要应用场景在于环境开发者预知部分功能在将来会存在多种使用场景,需要在环境中预留一个可扩展的hook,相当于针对部分功能函数或任务进行override,这不同于继承,虽然继承的时候也可以override其中的virtual方法,但是比起“大动干戈”对整个类继续继承扩展,如果有那么一种机制能够只是对局部的方法进行精准扩展,那么代码的可读性和灵活度将大大提升,callback机制就是用来完成这种精准扩展的。
callback机制比起上面的继承覆盖来说,区别主要在于环境开发者为环境使用者提前预留好了hook供使用者根据使用的需要进行扩展,这就要求环境开发者对环境的使用场景进行提前布局,需要有一些提前预见性。比起继承覆盖来说,callback机制更像是对简单粗暴的继承覆盖一刀切所进行的一次微创手术,环境开发者前期需要多付出一些effort,后期就可以一劳永逸了。
可以举几个例子说明下,什么场景下适合用callback机制,什么场景下只能用继承覆盖进行扩展。
先说一个典型的callback机制的应用场景。
我们在写driver的时候的run_phase流程一般是这样的:

virtual task run_phase(uvm_phase phase);
    ...
    while(1) begin
       ...
       seq_item_port.get_next_item(tr);
       ...
       drive_tr(tr);
       ...
       seq_item_port.item_done();
    end
    ...
endtask

环境开发者在开发这么个driver的时候应该考虑的问题就是当收到包之后到发包之前,是不是要预留给使用者这么一个功能,就是对包进行一些预处理,例如注错功能,这样后期一旦需要进行注错时只需要把这个预处理的注错功能进行定制化的扩展就可以了,否者的话就只能从driver继承一个新的driver对run_phase进行override了,所以环境开发者可以在driver_tr(tr)调用之前添加一个pre_drive()的函数对包进行预处理,这个pre_drive()函数体的具体实现留给环境使用者去完成,这便是callback机制的典型的应用场景。
再看一个只能用继承覆盖而不能用callback机制的典型场景,还是以driver为例,例如我们需要开发一个DDR2的driver,开发完成了我们可能还不知道未来的DDR3、DDR4…具体长什么样,所以我们无法提前预留好hook给未来新的driver功能做扩展,但是通常我们知道的是一般这种产品的迭代一般都是向下兼容的,也就是说ddr3一定是兼容ddr2的全部功能,所以说在ddr2上能跑pass的case在ddr3上一定也是可以跑pass的,未来需要在原有ddr2的环境上升级到ddr3时,我们就需要将ddr2_driver继承产生ddr3_driver,然后重写其中的run_phase()乃至driver_tr()一些列的方法,使用factory机制将ddr3_driver去override ddr2_driver再把所有ddr2环境中的case全部跑一遍。对于这种使用场景就只能用继承覆盖,而不能用callback机制,callback机制最大的特点就是他的预见性,即对类中的局部方法的精准覆盖。
callback的概念有点类似于c语言的接口,如果想要实现某个功能,如果c语言有接口函数,那么直接调用接口,改写接口函数而实现用户需求的功能。而uvm的callback也是类似的思想,环境的开发者在一些组件中预留好接口,而在开发的过程中将这些接口函数嵌入到环境开发里,这样如果有用户想要实现满足自身需求的功能,只需要改写这个接口函数,即可达到自己的验证目的。

2. callback机制如何实现?

真如上文提到的,callback机制是环境开发者给环境使用者预留的hook,方便环境使用者对环境进行定制化的扩展。这就决定了callback机制的实现需要环境开发者和使用者共同换成,我们在讨论callback机制的实现步骤的时候就需要明确分工。
使用callback的简单步骤如下:

  • 定义一个uvm_callback空壳类,并定义相关的callback方法(声明为virtual以便扩展覆盖,后期也可以根据实际需要扩充更多的callback方法);环境开发者
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值