uvm subscriber
Subscribers 本质上是一个分析端口(analysis port)的监听器。它们通过Subscribers 广播器(broadcaster),每当有对象通过连接的分析端口广播时就会接收到这些对象。uvm_component类本身不内置分析端口,而uvm_subscriber作为其扩展版本,自带一个名为analysis_export的分析端口。
Class definition
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);endfunctionpure virtual function void write (T, t);
endclass
use case
在典型情况下,agent会配备一个TLM分析端口,供其monitor将收集到的接口数据对象与其他测试平台组件共享。因此更推荐创建继承自uvm_subscriber的用户类,利用内置的analysis_export实现来连接agent的analysis_port。例如,可以在subscriber
中设置功能覆盖组和覆盖点,每当从代理接收到对象时就进行采样。
class my_coverage extends uvm_subscriber #(bus_pkt);covergroup cg_bus;...endgroupvirtual function void write (bus_pkt pkt);cg_bus.sample ();endfunction
endclassclass 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
并非必须继承自uvm_subscriber
,但这是一个推荐的做法,以便通过统一的方式让组件与分析端口连接。