uvm callback和factory重载的区别

重载,最开始的来源是c++ , sv面向对象的特性:集成,多态,重载。
sv除了支持对方法的重载,还支持对约束constraint的重载。

重载(sv)最大的优势是:子类句柄在用父类类型进行传递时,其行为仍然是子类的行为。 举例,trans很多时候,都是用uvm_sequence_item的形式在sqr,drv之间传递,然后$cast(tr, uvm_sequence_item) 获取的。

SV 重载

sv重载的原理是,class A作为父类,声明了一块内存addrA;class B extends A , 复制了A地址的内容到另一块地址addrB。重载父类的方法相当于是重写了addrB中的父类方法对应的地址内容。

常见的实例是case_base被使用的case重载; seq_base被具体的seq重载等等。

FACTORY重载

factory的重载和上述的sv重载机制不同(主要指对class的重载,而sv的重载指方法,个人理解,如有不对请指正)。factory是使用字符串进行创建类的。(通常的创建类的实体是在作用域内声明好句柄,然后new; 或者使用参数化类,也是在作用域内new) 具体实现这里就不说了,可以看源码,大概讲讲思路(参考UVM实战)。

  • 有一个typedef register#(type,name)this_type,重定义用register声明一个this_type, 然后根据传入的字符串作为上述的name,传入的类作为type。 this_type声明一个句柄me, 如果me非空,则me=new() 。然后把me放入一个哈希表(关联数组),索引为me.name。
  • 声明一个me_prt, 然后从哈希表中查找,索引为name,返回为上述存入的me(实体)。 me_prt.inst=new(uvm_test_top,null) (实际上源码里没有固定这个uvm_test_top,根据实际的变化

看了有点迷糊,总结一下, seq=a_seq::type_id::create(“b_seq”)时会把a_seq作为type, b_seq作为name送入factory中,里面有个表会记录这些信息。 使用override函数(a_seq重载为aa_seq)的前提是create之前,也就是说重新指向列表中的type(a_seq->aa_seq),在create时会用最新的type(aa_seq)去创建b_seq。即override的处理是预处理,在new之前的骚操作。

CALLBACK重载

callback的重载其实是放了一个地址指针在预留的位置(有点像编译过程中,留了一个symbol符号,然后在链接link时把符号换成具体的地址;这个描述可能有点差别),不用的时候,预留的位置指向的内容为空;用的时候,指向的内容按自己修改的替换,然后接入预留的位置。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值