2017-04-19 30 views

回答

2

约翰Aynsley(来自Doulos)写了一篇关于UVM的好文章,有一个可以帮助你的部分。该论文发表于DVCon 2011,您可以获得其中的free copy:“主流用户功能验证更容易UVM”。

正如文章中所解释的,这个想法是,你有一个uvm_monitor和一个uvm_subscriber。请注意,即使纸张在UVM订阅服务器中显示了所有功能覆盖代码,但没有任何东西阻止您在监视器中显示该代码。

的监控代码看起来如下图所示:

class my_monitor extends uvm_monitor; 
`uvm_component_utils(my_monitor) 
uvm_analysis_port #(my_tx) aport; 

virtual dut_if dut_vi; 
... 
task run; 
    forever 
    begin 
     my_tx tx; 
     // Sense the DUT pins on a clock edge 
     @(posedge dut_vi.clock); 
     tx = my_tx::type_id::create("tx"); 
     tx.cmd = dut_vi.cmd; 
     tx.addr = dut_vi.addr; 
     tx.data = dut_vi.data; 

     aport.write(tx); 
    end 
    endtask 
endclass 

然后创建一个用户,如图中的文件:

class my_subscriber extends uvm_subscriber #(my_tx); 
`uvm_component_utils(my_subscriber) 

// Coverage registers 
bit cmd; 
int addr; 
int data; 

covergroup cover_bus; 
coverpoint cmd; 
coverpoint addr; 
coverpoint data; 
endgroup 
... 
// Function called through analysis port 
function void write(my_tx t); 
    cmd = t.cmd; 
    addr = t.addr; 
    data = t.data; 
    cover_bus.sample(); 
endfunction 
endclass 

最后,您实例监视器和在用户在组件层次结构中进行下一级升级并按文件中所示连接它们。

class my_env extends uvm_env; 
    `uvm_component_utils(my_env) 

    my_monitor monitor; 
    my_subscriber subscriber; 
    ... 
    function void build; 
    super.build(); 
    monitor = my_monitor::type_id::create("monitor" , this); 
    subscriber = my_subscriber::type_id::create("subscriber", this); 
    endfunction 

    function void connect; 
    monitor.aport.connect(subscriber.analysis_export); 
    endfunction 
endclass 

PS。文件中显示的所有代码源文件都可以从Doulos website下载。