System verilog 如何在SystemVerilog中编写UVM监视器
有谁能给我举一个例子,说明如何在Systemverilog中编写覆盖率监视器,因为我是新手。我需要了解显示器,任何示例或参考资料都很好约翰·艾恩斯利(来自杜洛斯)写了一篇关于UVM的好文章,其中有一部分可以帮助您。这篇论文发表在DVCon 2011上,你可以从中得到一些信息:“主流用户更容易进行功能验证的UVM” 正如论文中所解释的,这个想法是您有一个System verilog 如何在SystemVerilog中编写UVM监视器,system-verilog,monitor,uvm,System Verilog,Monitor,Uvm,有谁能给我举一个例子,说明如何在Systemverilog中编写覆盖率监视器,因为我是新手。我需要了解显示器,任何示例或参考资料都很好约翰·艾恩斯利(来自杜洛斯)写了一篇关于UVM的好文章,其中有一部分可以帮助您。这篇论文发表在DVCon 2011上,你可以从中得到一些信息:“主流用户更容易进行功能验证的UVM” 正如论文中所解释的,这个想法是您有一个uvm\u监视器和一个uvm\u订户。请注意,尽管本文显示了UVM订阅者中的所有功能覆盖代码,但没有任何东西阻止您在监视器中使用该代码 监视器代码
uvm\u监视器
和一个uvm\u订户
。请注意,尽管本文显示了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
论文中显示的代码的所有源文件都可以从下载