微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 求助:env的run_phase没问题,到了下面agent的run_phase就跑不动了

求助:env的run_phase没问题,到了下面agent的run_phase就跑不动了

时间:10-02 整理:3721RD 点击:
各位:
最近正在使用UVM搭建验证环境。现在遇到一个问题,就是环境跑起来之后,就卡在开始的那个时刻了。以前出现这个问题都是driver的reset函数没写好,但是这次我从test---tb---env---agent---driver这样的顺序一层一层往下debug的时候发现,到env的run_phase中加入“this.print()”的代码,能正常运行,而到了master_agent中的run_phase加入这个代码,就一直运行不了,而master_agent的其他phase中,比如build_phase和connect_phase则没问题。我觉得仿真应该是卡在这里了,但是为什么卡住?真是一头雾水。虽然严重怀疑自己是犯了低级错误,但是奈何这几天热的心浮气躁,两天都没找出问题所在。因此上来求助各位。代码如下:

  1. `ifndef VDO_HANDWAVE_MASTER_AGENT_SV
  2. `define VDO_HANDWAVE_MASTER_AGENT_SV

  3. class vdo_handwave_master_agent extends uvm_agent;
  4. vdo_handwave_config cfg;

  5. vdo_handwave_master_sequencer sequencer;
  6. vdo_handwave_master_driverdriver;


  7. `uvm_component_utils_begin(vdo_handwave_master_agent)
  8. `uvm_field_object(cfg,UVM_DEFAULT|UVM_REFERENCE)
  9. `uvm_field_object(sequencer,UVM_DEFAULT|UVM_REFERENCE)
  10. `uvm_field_object(driver,UVM_DEFAULT|UVM_REFERENCE)
  11. `uvm_component_utils_end

  12. function new(string name,uvm_component parent);
  13. super.new(name,parent);
  14. endfunction : new

  15. extern virtual function void build_phase(uvm_phase phase);
  16. extern virtual function void connect_phase(uvm_phase phase);
  17. extern virtual task run_phase(uvm_phase phase);
  18. extern virtual function void update_config(input vdo_handwave_config cfg);
  19. endclass : vdo_handwave_master_agent

  20. function void vdo_handwave_master_agent::build_phase(uvm_phase phase);
  21. super.build_phase(phase);
  22. if(cfg==null) begin
  23. if(!uvm_config_db#(vdo_handwave_config)::get(this,"","cfg",cfg))
  24. `uvm_warning("NOCONFIG","Config not set for master agent")
  25. end
  26. sequencer = vdo_handwave_master_sequencer::type_id::create("sequencer",this);
  27. driver= vdo_handwave_master_driver::type_id::create("driver",this);
  28. endfunction : build_phase

  29. function void vdo_handwave_master_agent::connect_phase(uvm_phase phase);
  30. super.connect_phase(phase);
  31. driver.seq_item_port.connect(sequencer.seq_item_export);
  32. endfunction : connect_phase

  33. function void vdo_handwave_master_agent::update_config(input vdo_handwave_config cfg);
  34. sequencer.cfg=cfg;
  35. driver.cfg=cfg;
  36. endfunction : update_config

  37. task vdo_handwave_master_agent::run_phase(uvm_phase phase);
  38. this.print();
  39. endtask : run_phase

  40. `endif //VDO_MASTER_AGENT_SV

复制代码


  1. `ifndef VDO_HANDWAVE_ENV_SV
  2. `define VDO_HANDWAVE_ENV_SV
  3. class vdo_handwave_env extends uvm_env;
  4. vdo_handwave_config cfg;
  5. vdo_handwave_master_agent master;
  6. vdo_handwave_slave_agentslaves[];

  7. `uvm_component_utils_begin(vdo_handwave_env)
  8. `uvm_field_object(cfg,UVM_DEFAULT)
  9. `uvm_component_utils_end

  10. function new (string name , uvm_component parent);
  11. super.new(name,parent);
  12. endfunction : new

  13. extern virtual function void build_phase(uvm_phase phase);
  14. extern virtual function void connect_phase(uvm_phase phase);
  15. extern virtual function void start_of_simulation_phase(uvm_phase phase);
  16. extern virtual function void update_config(vdo_handwave_config cfg);
  17. extern virtual task run_phase(uvm_phase phase);
  18. //extern virtual task update_vif_enables();

  19. endclass : vdo_handwave_env

  20. function void vdo_handwave_env::build_phase(uvm_phase phase);
  21. super.build_phase(phase);
  22. if(cfg==null) begin
  23. if(!uvm_config_db#(vdo_handwave_config)::get(this,"","cfg",cfg)) begin
  24. `uvm_info("NOCONFIG","Using default_vdo_handwave_config",UVM_MEDIUM)
  25. $cast(cfg,factory.create_object_by_name("default_vdo_handwave_config","cfg"));
  26. end
  27. end
  28. uvm_config_object::set(this,"*","cfg",cfg);
  29. foreach(cfg.slave_configs[i]) begin
  30. string sname;
  31. sname=$psprintf("slave[%0d]*",i);
  32. uvm_config_object::set(this,sname,"cfg",cfg.slave_configs[i]);
  33. master=vdo_handwave_master_agent::type_id::create(cfg.master_config.name,this);
  34. slaves=new[cfg.slave_configs.size()];
  35. for(int i=0;i<cfg.slave_configs.size();i++) begin
  36. slaves[i]=vdo_handwave_slave_agent::type_id::create($psprintf("slave[%0d]",i),this);
  37. end
  38. end
  39. endfunction : build_phase

  40. function void vdo_handwave_env::connect_phase(uvm_phase phase);
  41. super.connect_phase(phase);
  42. endfunction : connect_phase

  43. function void vdo_handwave_env::start_of_simulation_phase(uvm_phase phase);
  44. set_report_id_action_hier("CFGOVR",UVM_DISPLAY);
  45. set_report_id_action_hier("CFGSET",UVM_DISPLAY);
  46. check_config_usage();
  47. endfunction : start_of_simulation_phase

  48. function void vdo_handwave_env::update_config(vdo_handwave_config cfg);
  49. master.update_config(cfg);
  50. foreach(slaves[i])
  51. slaves[i].update_config(cfg.slave_configs[i]);
  52. endfunction : update_config

  53. task vdo_handwave_env::run_phase(uvm_phase phase);
  54. endtask : run_phase
  55. `endif //VDO_HANDWAVE_ENV_SV

复制代码

初来乍到,发表一下拙见
我怀疑您在run_phase的0时刻出现了死循环,请你查看一下自己的code。

你好,我也遇到这种问题了。你是怎么解决的?

和questa的uvm例子比对了一下,文件层次和内容写法一样,就是在仿真的过程中,调用了sequence 的start方法,就卡死了。搞了好几天了。头大啊。

monitor中是不是没有做时序的事情。

我的问题这样解决了

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

网站地图

Top