UVM Subscriber

2023-12-10
UVM

Subscriber基本上是analysis port的listener。它們訂閱broadcaster並透過連接的analysis port廣播時接收object。 uvm_component沒有內建analysis port,而uvm_subscriber是一個擴展版本,具有名為analysis_export 的analysis port。

Class definition

1
2
3
4
5
6
7
8
9
10
11
12
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

Use Case

在通常情況下,agent有一個用於其monitor的 TLM analysis port,以便與其他testbench 的component共享在agent的interface上收集的data object。因此,建立一個繼承自uvm_subscriber的class並使用內建的analysis_export實作來連接到agent的analysis port會比較容易。例如,在subscriber中有 functional coverage groups和coverpoints,並在其從agent接收到object時進行取樣。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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