System verilog 如何在SystemVerilog中编写UVM监视器

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

有谁能给我举一个例子,说明如何在Systemverilog中编写覆盖率监视器,因为我是新手。我需要了解显示器,任何示例或参考资料都很好

约翰·艾恩斯利(来自杜洛斯)写了一篇关于UVM的好文章,其中有一部分可以帮助您。这篇论文发表在DVCon 2011上,你可以从中得到一些信息:“主流用户更容易进行功能验证的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
论文中显示的代码的所有源文件都可以从下载