【问题标题】:uvm - override virtual task in extended classuvm - 覆盖扩展类中的虚拟任务
【发布时间】:2017-10-21 15:20:09
【问题描述】:

我正在编写一个扩展到我的记分牌的检查器。 为此,我试图用我的检查器类中定义的新任务覆盖 parser_pkt 任务。这个任务被调用到我的 uvm run_phase 中。但是,尽管我为每个任务添加了“虚拟”,但我使用了相同的任务签名,并且我使用 super 作为我的 run_phase,这不起作用。当我将打印添加到我的两个任务时,代码正在运行在记分板类中定义的 parser_pkt 任务。 为什么我做错了?

class my_scoreboard_c extends uvm_component;
`uvm_component_utils(my_scoreboard_c)

extern virtual task run_phase(uvm_phase phase);
extern virtual task parser_pkt(int a);
endclass

task my_scoreboard_c::run_phase(uvm_phase);
parser_pkt(3);
endtask

task my_scoreboard_c::parser_pkt(int a);
endtask

跟随我的跳棋课:

class my_checker_c extends my_scoreboard_c;
`uvm_component_utils(my_checker_c)

task run_phase(uvm_phase);
super.run_phase(phase);
endtask

task parser_pkt(int a);
endtask 
endclass

感谢您的帮助

【问题讨论】:

    标签: polymorphism virtual uvm


    【解决方案1】:

    将此代码添加到您的my_checker_c 类的run_phase 中:

    task run_phase(uvm_phase);
      `uvm_info( get_name(), "YOU SHOULD SEE THIS MESSAGE", UVM_NONE )
      super.run_phase(phase);
      `uvm_info( get_name(), "YOU SHOULD NOT SEE THIS MESSAGE", UVM_NONE )
    endtask
    

    基类run_phase什么时候完成执行?本质上,您允许基类的run_phase 任务接管。 UVM 的run_phase 将在所有反对意见都被放弃(或发生超时)之前完成。因此,您实际上从未允许您的扩展类'run_phase 在您的模拟中运行。因此,解决方案是从my_checker_c组件的run_phase中去掉super.run_phase调用。

    【讨论】:

      【解决方案2】:

      让我们从基础开始,然后逐步向上。

      您确定要实例化 my_checker_c 对象吗?您可以在某处添加$display("%p", this)(例如在run_phase(...) 的开头进行检查。

      【讨论】:

      • 我在构建阶段、运行阶段和检查阶段添加了显示。在我的日志中,只有run_phase的显示没有打印出来……
      • @Laura 显然 `$display("%p", this) 并没有像我想象的那样做。我认为它会打印出对象的确切类型,但我在两个不同的模拟器中对其进行了测试,并且都给出了不同的结果。尝试在 EDAPlayground 上制作一个小示例:edaplayground.com 并附上完整代码。
      • 也许在任务中使用$typename(this) 对调试很有用。
      猜你喜欢
      • 2018-01-04
      • 2020-05-30
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多