forked from letitbe0201/AXI-DMA-master-verification
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathitem_subscriber.svh
61 lines (55 loc) · 1.51 KB
/
item_subscriber.svh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
`ifndef ITEM_SUBSCRIBER_SVH
`define ITEM_SUBSCRIBER_SVH
class item_subscriber #(
type ITEM = uvm_sequence_item,
type ID = int
) extends uvm_subscriber #(ITEM);
protected uvm_event bufs[$];
protected uvm_event id_bufs[ID][$];
function void write(ITEM t);
ID id;
foreach(bufs[i]) begin
bufs[i].trigger(t);
end
bufs.delete();
id = get_id_from_item(t);
if (!id_bufs.exists(id)) begin
return;
end
foreach(id_bufs[id][i]) begin
id_bufs[id][i].trigger(t);
end
id_bufs.delete(id);
endfunction : write
virtual task get_item(ref ITEM item);
uvm_event x;
x = get_buf();
wait_for_trigger(x, item);
endtask : get_item
virtual task get_item_by_id(ref ITEM item, input ID id);
uvm_event y = get_id_buf(id);
wait_for_trigger(y, item);
endtask : get_item_by_id
protected virtual function ID get_id_from_item(ITEM item);
ID id;
return id;
endfunction : get_id_from_item
protected function uvm_event get_buf();
uvm_event z = new();
bufs.push_back(z);
return z;
endfunction : get_buf
protected function uvm_event get_id_buf(ID id);
uvm_event u = new();
id_bufs[id].push_back(u);
return u;
endfunction : get_id_buf
protected task wait_for_trigger(input uvm_event ev, ref ITEM item);
ev.wait_on();
void'($cast(item, ev.get_trigger_data()));
endtask : wait_for_trigger
function new(string name="item_subscriber", uvm_component parent=null);
super.new(name, parent);
endfunction : new
endclass : item_subscriber
`endif