有人可以向我展示如何在Systemverilog中编写Coverage监视器的示例,因为我是新手。我需要了解显示器的任何示例或引用也很好
答案 0 :(得分:2)
John 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下载论文中显示的代码的所有源文件。