如何在SystemVerilog中编写UVM监视器

时间:2017-04-19 10:01:08

标签: system-verilog monitor uvm

有人可以向我展示如何在Systemverilog中编写Coverage监视器的示例,因为我是新手。我需要了解显示器的任何示例或引用也很好

1 个答案:

答案 0 :(得分:2)

John Aynsley(来自Doulos)写了一篇关于UVM的好文章,其中有一节可以帮助你。该论文发表于DVCon 2011,你可以得到free copy:" 主流用户进行功能验证的更容易的UVM "。

正如文章中所解释的那样,您的想法是uvm_monitoruvm_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下载论文中显示的代码的所有源文件。