在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10281|回复: 11

[求助] 求助:UVM中的override问题

[复制链接]
发表于 2013-5-9 11:59:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
各位:
      最近在使用UVM搭建验证平台,其中涉及到override的问题,我用的是set_type_override_by_type函数来实现override,但是貌似没有替换成功啊。代码如下:
初始的test class:




  1. class base_test extends uvm_test;
  2.     normal_apb_config demo_cfg;
  3.     ...
  4.     virual function void build_phase(uvm_phase phase);
  5.         demo_cfg=normal_apb_config::type_id::create("demo_cfg");
  6.         ...
  7.    ...


复制代码

新的test class代码:




  1. class int_test extends base_test;
  2.     ...
  3.     function void build_phase(uvm_phase phase);
  4.         super.build_phase(phase);
  5.         set_type_override_by_type(normal_apb_config::get_type(),ir_apb_config::get_type());
  6.     endfunction : build_phase
  7.     task run_phase(uvm_phase phase);
  8.         super.run_phase(phase);
  9.         $display("***Debug override***");
  10.         demo_cfg.print();
  11.     endtask: run_phase
  12. ...


复制代码

而两个config类的代码如下:




  1. class normal_apb_config extends apb_config;
  2.     `uvm_object_utils(normal_apb_config)
  3.     function new(string name ="normal_apb_config");
  4.         super.new(name);
  5.         add_master("master",UVM_ACTIVE);
  6.         add_slave("slave0",32'h0000_0000,32'h0000_0400,0,UVM_PASSIVE);
  7.     endfunction
  8. endclass : normal_apb_config

  9. class ir_apb_config extends normal_apb_config;
  10.     `uvm_object_utils(ir_apb_config)
  11.     virtual ir_if irq_if;
  12.     function new(string name ="ir_apb_config");
  13.         super.new(name);
  14.         add_master("master",UVM_ACTIVE);
  15.         add_slave("slave0",32'h0000_0000,32'h0000_0380,0,UVM_PASSIVE);
  16.     endfunction
  17.     task wait_for_irq;
  18.         @(posedge irq_if.irq);
  19.     endtask
  20. endclass : ir_apb_config



复制代码

而运行到"demo_cfg.print()"时候,打印出来的end_addr还是32'h400,而不是32‘h380.
如何才能override成功呢?
发表于 2013-5-9 13:17:00 | 显示全部楼层
个人感觉一定要先执行override,再create,override才会成功。都已经create好了,再override就不行了。
LZ在新的test class代码中是先执行的super.build_phase(phase),然后才是set_type_override_by_type。建议这两句换一下再试试。
 楼主| 发表于 2013-5-9 13:46:25 | 显示全部楼层
我两个交换了一下两行代码,有个新问题:你可以看见我的config里面都有一个add_slave函数,然后里面产生的slave是一个数组。这两个config类都是只加载了一个slave。
新的问题是:“UVM_ERROR ./apb/sv/apb_slave_agent.sv(96) @ 0: uvm_test_top.tb0.apb0.slave[1] [NOVIF] virtual interface must be set for: uvm_test_top.tb0.apb0.slave[1].vif
鉴于我的config都是只配置了一个slave,所以我可以认为是一部分替换成功,一部分替换不成功,因此两个config类都生效,从而产生了两个slave?
还是说是我的基本类apb_config写的有问题,而导致override的时候虽然能替换成功,但是还是多配了一个slave?
貌似不管哪种情况都不好解决呀。
 楼主| 发表于 2013-5-9 14:00:04 | 显示全部楼层
另外,我想问问,是否要实现override,必须是ir_apb_config继承normal_apb_config,如果它们都继承apb_config,作为apb_config的一级子类,这样就不能进行替换了?
发表于 2013-5-9 14:25:00 | 显示全部楼层
回复 3# oscillator_cn1
个人感觉你的ir_apb_config  class中的new中不应该再写super.new, 否则在ir_apb_config 的new中就会两次调用add_master和add_slave。还是你本来就想在
ir_apb_config 的new中 调用两次?
发表于 2013-5-9 14:25:03 | 显示全部楼层




   Use the type and instance override calls to override the base types with a derived types.
 楼主| 发表于 2013-5-9 15:58:38 | 显示全部楼层
回复 5# sdzplwj

刚试了注释掉super.new(name),结果是一样的。
 楼主| 发表于 2013-5-9 16:09:41 | 显示全部楼层
回复 6# tbb2009

一样的,同样会多出一个不希望的slave出来。
我觉得是因为我把“add_master"和“add_slave"两个函数都放到new里面去执行的原因,而new函数又是不可重载的函数,父类和子类的new都要执行的原因。我试过把“add_master"和“add_slave"封到new之外的函数中,但是还是得在new中调用,不然没办法执行,要是uvm_object也像uvm_component一样有各种phase就好了,我可以直接在build_phase中改写。
 楼主| 发表于 2013-5-9 16:45:47 | 显示全部楼层
唉——,多一个slave的问题解决了,但是又有新问题,总不消停啊~~~~~~~~
首先,多一个slave的解决办法,将”add_slave“函数放到new之外



  1. class normal_apb_config extends apb_config;
  2.     `uvm_object_utils(normal_apb_config)
  3.     function new(string name ="normal_apb_config");
  4.         super.new(name);
  5.         gen_master_and_slaves();
  6.     endfunction
  7.     virtual function void gen_master_and_slaves();
  8.         add_master("master",UVM_ACTIVE);
  9.         add_slave("slave0",32'h0000_0010,32'h0000_0300,0,UVM_PASSIVE);
  10.     endfunction : gen_master_and_slaves
  11. endclass : normal_apb_config

  12. class ir_apb_config extends normal_apb_config;
  13.     `uvm_object_utils(ir_apb_config)
  14.     virtual ir_if irq_if;
  15.     function new(string name ="ir_apb_config");
  16.         super.new(name);
  17.     endfunction
  18.     function void gen_master_and_slaves();
  19.         add_master("master",UVM_ACTIVE);
  20.         add_slave("slave0",32'h0000_0000,32'h0000_0380,0,UVM_PASSIVE);
  21.     endfunction : gen_master_and_slaves
  22.     task wait_for_irq;
  23.         @(posedge irq_if.irq);
  24.     endtask
  25. endclass : ir_apb_config



复制代码
新问题是:我的ir_apb_config中不是多了一个virtual interface么,每次都说”irq_if is not a class item"。难道说override的class新加的成员没办法增加的么?还是别的什么地方有问题?
发表于 2014-5-7 15:03:51 | 显示全部楼层
我觉得不是因为ir_apb_config中使用super.new的问题,也不是执行creste和override顺序问题,建议你用set_inst_override_by_type函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-15 02:39 , Processed in 0.022046 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表