uvm_subscriber
2024-09-03 14:29:40
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博客
最新文章
- Kotlin偏好设置
- webform:分页组合查询
- 20145227&;20145201 《信息安全系统设计基础》实验二 固件开发
- DataGridView单元格美化
- XidianOJ 1183 Water Problem: Items divided
- JS魔法堂:追忆那些原始的选择器
- LR处理文件上传和下载
- page show
- python和pywin32实现窗口查找、遍历和点击
- poj 2553 The Bottom of a Graph
- 【大话QT之十】实现FTP断点续传(需要设置ftp服务器为“PASV”被动接收方式)
- PHP连续签到
- 存储容量和IOPS的关系
- 543. Diameter of Binary Tree
- 面试题收集---grep和find的区别
- pycharm 安装激活操作
- 最新CoreData封装Demo
- phpstorm 初体验
- 反射, getClass(), 和something.class以及类型类(转)
- Centos7 安装 ActiveMq
热门文章
- MAC地址知识
- python 爬虫新手入门教程
- 自己实现Controller——标准型
- centos7 未启用swap导致内存使用率过高。
- Spring Cloud Hystrix 学习(一)
- 一起学习PHP中断言函数的使用
- CSS linear-gradient() 函数
- Struts2 S2-061 远程命令执行漏洞复现(CVE-2020-17530)
- python之jsonpath
- python爬虫与mysql,mongobd(1)(2)第一个视频python_pymysql 安装与使用类型,import解决 问题之模块引ru 就是解决你的问题