uvm_subscriber
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博客
uvm_subscriber的更多相关文章
- uvm_subscriber——告诉她我们来过
		
Subscribers are basically listeners of an analysis port. They subscribe to a broadcaster and receive ...
 - UVM中的class--2
		
1)uvm_component从uvm_report_object继承而来,提供的功能包括: 1)Hierarchy,-----searching and traversing component h ...
 - UVM中的class
		
UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...
 - uvm_comps.svh
		
UVM的文件组织方式很有意思,比如,在src/comps/ 下的所有文件都通过uvm_comps.svh 包含进去. `include "comps/uvm_pair.svh" ` ...
 
随机推荐
- Spring Boot 2.x 之构建Fat Jar和可执行Jar
			
Spring Boot提供的Maven插件spring-boot-maven-plugin可以用来构建Fat Jar和可执行Jar. 1.Fat Jar Fat Jar需要使用 java -jar x ...
 - go相关
			
mac 上build go 如果想要在centos上面执行 必须使用下面的方式 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello ...
 - 记录一次C语言中free(p)失败
			
首先介绍一下自己的程序出错的原因,然后总结一下什么时候free会失败. 1.程序伪代码 // 已知payload已经指向一部分内存数据 char * payload; int payload_len; ...
 - dede调用数据时,字符串替换函数使用
			
{dede:sql sql="SELECT typename,typedir,typeimg FROM #@__arctype where topid=30 limit 0,6"} ...
 - Jmeter系列(26)- 常用逻辑控制器(5) | 循环控制器Loop Controller
			
循环控制器(Loop Controller) 字面意思,循环该控制器下的请求 设定固定循环次数,或者一直循环 同线程组的循环是父子关系,大家可以试下,如果线程组设置了一直循环,而循环控制器设置了2次, ...
 - python刷题第三周
			
以下是本周有所收获的题目 第一题: 第4章-4 验证"哥德巴赫猜想" (20 分) 数学领域著名的"哥德巴赫猜想"的大致意思是:任何一个大于2的偶数总能表示为两 ...
 - Appium Android Toast控件
			
Android Toast控件是Android系统级别的控件,不是App的控件,getPageSource是⽆法找到的. Toast介绍 1.背景 在安卓设备里面,使用各种手机应用程序的时候,需要先进 ...
 - java 工具类 验证码
			
第一步: 引入工具类 工具类一: import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import jav ...
 - 使用jemeter构造各种变量数据
			
使用手动创建测试数据太麻烦,因此考虑用jmeter写了一些创建测试数据的脚本,针对那些变量非固定的数据可以利用函数来实现 通过函数助手添加各种变量数据 Tools--->函数助手 1:生成当前时 ...
 - kibana操作
			
一些KIBANA的操作,记录下,免下次重复写 #创建索引名为kb_question的索引,并添加mapping,即各字段属性 PUT kb_question { "mappings" ...