微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > 微电子学习交流 > 请教systemverilog验证中callback的含义

请教systemverilog验证中callback的含义

时间:12-12 整理:3721RD 点击:
验证里面为了保证验证框架的复用,会留很多“hook”,然后采用callback的方式实现。详见《Systemverilog for Verification》。
请教:个人理解此处的callback与C++中函数的重载有些类似,不知道是否正确。麻烦高手指点~~

你能把这两个联想到一起也挺不容易的
callback在sv和软件中的意思都差不多的,目的是为了留后门提高重用性

那请问sv中,单从语法和语义的角度看,callback的正确理解是什么样的?因为我印象中c++里面也有callback这个概念(不好意思,C++不熟悉)。

中文叫做“回调”,跟重载没什么关系
我举个例子你就明白了,比如c语言里的sort函数,用的就是callback的机制。
sort函数实现了排序功能,但是它并不知道调用它的人想按照什么样子的顺序排
(是从大到小呢,还是从小到大,还是按照字典序),所以sort接收一个函数指针
类型的参数cmp,这是一个比较函数,用于排序时比较两个元素的大小。函数cmp
由用户实现,但是却是由sort调用,callback(回调)指的就是这样一种方式。

首先要清楚callback不是SV的语法,而是实际应用中提高重用性的一种设计模式
一般而言你写一个基础的模块,工作流程可能是 A -> B -> C. 但是用户在扩展你这个模块的时候可能需要在A -> B 之间插入一些事情D。使得工作流程变成 A -> D -> B -> C. 所以你就需要在A->B之间留一个callback,让用户可以在这个callback里面插入想做的事情D。

这个例子我感觉用来类比我觉得不见得合适
在验证中callback一般只作为预留的扩展使用,并不一定要提供某种实现,一般callback的base class也就是个virtual class,只定义接口,不提供实现。而子模块在继承时也不必要实现这些callback除非真的需要。总而言之验证中的callback多为了扩展而预留,而非必要功能的一部分。

callback不是SV语法  
callback最早在验证领域出现是 synopsys的RVM验证方法学(基于vera的)   之后提出基于SV的验证方法学VMM后被广泛接受
到了OVM/UVM阶段 callback似乎可以被factory功能取代了  

Callback的作用和factory还是截然不同的
假设你需要一个大的task中间预留几个点让用户可以扩展,用callback最合适不过。如果用factory,意味着你可能需要为了在这个task中间插入一些code而重写整个task,然后用factory override的方式替换掉原来的object。
UVM和OVM都是支持callback的

是的,而且在callback task里面插入的code可能和原来的那个class毫无关系。从class功能划分的角度,也不应该使用factory的方式放到原来的class中。

其实我就是看到base class里面定义了callback的task,然后在继承他的子类里面实现该task的行为,才有了和C++重载类似的疑问。
类似之处:最开始该task在基类里面定义,没有具体实现,然后在各种子类中,该task有各种不同具体实现。

callback class本身是一个典型的多态的例子(和重载还是有区别),这里相当于是两种设计模式混合在了一起使用。callback base class其实是一个虚的钩子(只定义一些virtual task),预留在某个class的task中。如果真正要使用这个钩子,还是得继承这个callback base class提供具体的实现,然后通过某种方式(如factory override)覆盖回去。

callback的主要用处还是在VIP上尤其是现在很多VIP都是C内核,对于一般tb而言,factory更实用。

@luckymilk 举的例子挺合适的,因为最初callback就是源自C函数,而且是用函数指针的方式来实现的,只是到了OOP中,用virtual method或functor实现起来更方便而已。

callback和factory不是互斥的,一般两者是结合起来用的

callback和?VM没有关系,关键是SV语言支持。

callback是sv语言自带支持的么。。?在ieee文档里没找到的说

callback与编程语言的语法、语义无关,所以在SV的IEEE文档不会找到相关介绍。
callback只是一种机制:
(1) 由底层(如OS等)调用、但是由顶层(API层)提供函数实现的机制,这种机制和一般的底层提供函数实现、顶层调用函数的方向相反,所以称之为回调,这也是callback最初的定义,它要求编程语言本身支持函数指针
(2) 在面向对象的语言中,由基类定义虚函数原型、由继承类提供函数实现,或者由基类定义并实现虚函数、由继承类根据自身需要重新实现该函数,并且该函数在其它地方会被调用,而在调用时基于多态的原则,执行的是继承类函数的code。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top