看看这个"UVM陷阱",你是不是也遇到过

电子说

1.3w人已加入

描述

分享一个近期项目中遇到的函数调用问题。

略去定位过程和具体的业务细节,原问题的模型可以抽象为如下的demo:

import uvm_pkg::*;
`include "uvm_macros.svh"

class test extends uvm_test;
    `uvm_component_utils(test)

    virtual task run();
        bit[3:0] run_cnt;
        run_cnt++;
        $display("run_cnt=%0d, enter run @%t",run_cnt,$time);
        //other code
    endtask

    virtual task main_phase(uvm_phase phase);
        super.main_phase(phase);
        phase.raise_objection(this);
        run();
        phase.drop_objection(this);
    endtask

    function new(string name="test",uvm_component parent = null);
        super.new(name,parent);
    endfunction
endclass

program tb_top;
 initial begin
        run_test("test");
 end
endprogram

设计一个run函数用于处理某些业务逻辑,并在UVC的main_phase中调用。看似简单的逻辑,运行仿真后得到如下的信息:

UVM

run被调用了两次!

.........................

.........................

如果你也一时间想不到原因,可以参考下面的原因分析。

 

 

原因如下:

  1. 翻阅UVM源码就会发现,在uvm_component中,存在一个默认的run函数。  

    UVM

     

  2. UVM的phase机制,run_phase和main_phase,reset_phase等其余耗时的phase是并行运行的。而默认的run_phase会调用run函数。  

    UVM

     

  3. 在上述代码的0时刻,默认的run_phase调用一次run函数,而main_phase也调用了一次run函数。

因此从uvm_component扩展的UVC中,尽量不要使用run函数,使用其他命名方式。


审核编辑 :李倩

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分