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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)