subscriber是消费,用户的意思

uvm_subscriber主要作为coverage的收集方式之一

uvm_subscriber的代码非常简单,继承于uvm_component,再加上一个analysis export而已。

其代码如下:

virtual class uvm_subscriber #(type T=int) extends uvm_component;
typedef uvm_subscriber #(T) this_type; uvm_analysis_imp #(T, this_type) analysis_export; function new (string name, uvm_component parent);
super.new (name, parent);
analysis_export = new ("analysis_imp", this);
endfunction pure virtual function void write (T, t);
endclass
 

他的用法一般是,将monitor的analysis port连接到subscriber,将transaction传递过来,做function coverage。

 
class my_coverage extends uvm_subscriber #(bus_pkt);

  covergroup cg_bus;
...
endgroup virtual function void write (bus_pkt pkt);
cg_bus.sample ();
endfunction
endclass class my_env extends uvm_env;
...
virtual function void connect_phase (uvm_phase phase);
super.connect_phase (phase);
my_agent.custom_ap.connect (my_cov.analysis_export);
endfunction
endclass

example:

class uvm_ip_subscriber extends uvm_subscriber;
//這裡使用FIFO通信而不是IMP,大大降低了工作量
uvm_tlm_analysis_fiof#(dma_trans) dma_monitor_to_sub_fifo[1]; extern function new(string name, uvm_component parent);
extern virtual function write(T t);
extern virtual task get_dma_trans(); extern virtual task run_phase(uvm_phase phase); //coverage group
covergroup ostd_cfg_group;
option.per_instance = 1;
ostd: coverpoint(reg_cfg_trans.reg_wr_ostd[7:0]){
bins udb_0 = {0};
bins udb_1 = {[1:8]};
bins udb_2 = {[9:16]};
bins udb_3 = {[17:254]};
bins udb_4 = {255};
}
endgroup endclass: uvm_ip_subscriber
function uvm_ip_subscriber::new(string name, uvm_component parent);
super.new();
dma_monitor_to_sub_fifo[0] = new("dma_monitor_to_sub_fifo_0", this);
//創建covergroup
ostd_cfg_group = new();
endfunction: new //必須得重寫write這個純虛函數
function uvm_ip_subscriber::write(T t);
endfunction: write
task uvm_ip_subscriber::get_dma_trans();
dma_monitor_to_sub_fifo[0].get(tr);
$cast(tr_clone, tr);
reg_cfg_tr_q[0].push_back(tr_clone); if(reg_cfg_tr_q[0].size() > 0) begin
reg_cfg_trans = reg_cfg_tr_q[0].pop_front();
//採樣
ostd_cfg_group.sample();
end
endtask: get_dma_trans

参考:

Subscriber [uvm_subscriber] (chipverify.com)

uvm_subscriber (verificationacademy.com)

uvm_subscriber | Francis's blog (francisz.cn)

[UVM]UVM Component之Subscriber_元直的博客-CSDN博客

最新文章

  1. Kotlin偏好设置
  2. webform:分页组合查询
  3. 20145227&20145201 《信息安全系统设计基础》实验二 固件开发
  4. DataGridView单元格美化
  5. XidianOJ 1183 Water Problem: Items divided
  6. JS魔法堂:追忆那些原始的选择器
  7. LR处理文件上传和下载
  8. page show
  9. python和pywin32实现窗口查找、遍历和点击
  10. poj 2553 The Bottom of a Graph
  11. 【大话QT之十】实现FTP断点续传(需要设置ftp服务器为“PASV”被动接收方式)
  12. PHP连续签到
  13. 存储容量和IOPS的关系
  14. 543. Diameter of Binary Tree
  15. 面试题收集---grep和find的区别
  16. pycharm 安装激活操作
  17. 最新CoreData封装Demo
  18. phpstorm 初体验
  19. 反射, getClass(), 和something.class以及类型类(转)
  20. Centos7 安装 ActiveMq

热门文章

  1. MAC地址知识
  2. python 爬虫新手入门教程
  3. 自己实现Controller——标准型
  4. centos7 未启用swap导致内存使用率过高。
  5. Spring Cloud Hystrix 学习(一)
  6. 一起学习PHP中断言函数的使用
  7. CSS linear-gradient() 函数
  8. Struts2 S2-061 远程命令执行漏洞复现(CVE-2020-17530)
  9. python之jsonpath
  10. python爬虫与mysql,mongobd(1)(2)第一个视频python_pymysql 安装与使用类型,import解决 问题之模块引ru 就是解决你的问题