-3
任何人都可以向我展示如何在Systemverilog中编写Coverage监视器的示例,因为我是新手。我需要了解显示器任何示例或参考也很好如何在SystemVerilog中编写UVM监视器
任何人都可以向我展示如何在Systemverilog中编写Coverage监视器的示例,因为我是新手。我需要了解显示器任何示例或参考也很好如何在SystemVerilog中编写UVM监视器
约翰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下载。