14 `uvm_component_utils_begin(cl_syoscb_queue_std)
15 `uvm_field_queue_object(items, UVM_DEFAULT)
16 `uvm_component_utils_end
21 function new(string name, uvm_component parent);
22 super.new(name, parent);
29 extern
virtual function bit
add_item(string producer, uvm_sequence_item item);
30 extern
virtual function bit
delete_item(cl_syoscb_proxy_item_base proxy_item);
32 extern
virtual function int unsigned
get_size();
33 extern
virtual function bit
empty();
34 extern
virtual function bit
insert_item(string producer, uvm_sequence_item item, int unsigned idx);
38 extern
virtual function bit
delete_iterator(cl_syoscb_queue_iterator_base iterator);
47 extern
virtual function void get_native_queue(ref cl_syoscb_item q[$]);
58 this.
items.push_back(new_item);
72 if(!$cast(proxy_item_std,proxy_item)) begin
73 `uvm_fatal("Incorrect item type", $sformatf("[%s]:Proxy_item ", this.cfg.get_scb_name()));
75 end else if(proxy_item == null) begin
76 `uvm_info("NULL", $sformatf("[%s] Passed null item to queue %s for deletion. Ignoring it", this.cfg.get_scb_name(), this.get_name()), UVM_DEBUG)
80 idx = proxy_item_std.idx;
82 if(idx < this.items.size()) begin
84 cl_syoscb_queue_iterator_base iter[$];
88 while(!this.iter_sem.try_get());
89 producer = this.items[idx].get_producer();
90 this.items.delete(idx);
93 iter = this.iterators.find(x) with (x.next_index() > idx);
94 foreach(iter[i]) begin
95 void'(iter[i].previous());
103 `uvm_info("OUT_OF_BOUNDS", $sformatf("[%s]: Idx: %0d is not present in queue: %0s", this.cfg.get_scb_name(), idx, this.get_name()), UVM_DEBUG);
113 if(!$cast(proxy_item_std, proxy_item)) begin
114 `uvm_fatal("Incorrect item type", $sformatf("[%s]:Proxy_item was of type %0s", this.cfg.get_scb_name(), proxy_item.get_type_name()));
117 idx = proxy_item_std.idx;
120 if(idx < this.items.size()) begin
123 `uvm_info("OUT_OF_BOUNDS", $sformatf("[%s]: Idx: %0d is not present in queue: %0s", this.cfg.get_scb_name(), idx, this.get_name()), UVM_DEBUG);
126 endfunction: get_item
129 function int unsigned cl_syoscb_queue_std::get_size();
130 return this.items.size();
131 endfunction: get_size
134 function bit cl_syoscb_queue_std::empty();
135 return this.get_size()==0;
139 function bit cl_syoscb_queue_std::insert_item(string producer, uvm_sequence_item item, int unsigned idx);
140 cl_syoscb_item new_item;
142 new_item = this.pre_add_item(producer, item);
144 if(idx < this.items.size()) begin
145 cl_syoscb_queue_iterator_base iters[$];
149 while(!this.iter_sem.try_get());
150 this.items.insert(idx, new_item);
153 iters = this.iterators.find(x) with (x.next_index() >= idx);
154 for(int i = 0; i < iters.size(); i++) begin
159 void'(iters[i].next());
162 end else if(idx == this.items.size()) begin
163 this.items.push_back(new_item);
165 `uvm_info("OUT_OF_BOUNDS", $sformatf("[%s]: Idx: %0d too large for queue %0s", this.cfg.get_scb_name(), idx, this.get_name()), UVM_DEBUG);
169 this.post_add_item(new_item);
171 endfunction: insert_item
174 function cl_syoscb_queue_iterator_base cl_syoscb_queue_std::create_iterator(string name = "");
175 cl_syoscb_queue_iterator_std result;
177 cl_syoscb_queue_iterator_base f[$];
181 while(this.iter_sem.try_get() == 0);
184 iter_name = $sformatf("%0s_iter%0d", this.get_name(), this.num_iters_created);
190 f = this.iterators.find_index() with (item.get_name() == name);
191 if(f.size() != 0) begin
192 `uvm_info("ITERATOR", $sformatf("[%0s] An iterator with the name %0s already exists", this.cfg.get_scb_name(), name), UVM_DEBUG)
196 result = cl_syoscb_queue_iterator_std::type_id::create(iter_name);
200 void'(result.set_queue(this));
202 this.iterators[result] = result;
203 this.num_iters_created++;
207 endfunction: create_iterator
210 function bit cl_syoscb_queue_std::delete_iterator(cl_syoscb_queue_iterator_base iterator);
211 if(iterator == null) begin
212 `uvm_info("NULL", $sformatf("[%s]: Asked to delete null iterator from list of iterators in %s",
213 this.cfg.get_scb_name(), this.get_name()), UVM_DEBUG);
218 while(!this.iter_sem.try_get());
220 this.iterators.delete(iterator);
224 endfunction: delete_iterator
227 function cl_syoscb_queue_locator_base cl_syoscb_queue_std::get_locator();
228 cl_syoscb_queue_locator_std locator;
230 locator = cl_syoscb_queue_locator_std::type_id::create($sformatf("%s_loc", this.get_name()));
231 void'(locator.set_queue(this));
233 endfunction: get_locator
236 function void cl_syoscb_queue_std::do_flush_queue();
238 endfunction: do_flush_queue
244 function void cl_syoscb_queue_std::get_native_queue(ref cl_syoscb_item q[$]);
246 endfunction: get_native_queue
virtual bit add_item(string producer, uvm_sequence_item item)
Queue API: See cl_syoscb_queue_base::add_item for more details
virtual void do_flush_queue()
See cl_syoscb_queue_base::do_flush_queue for more details.
virtual void post_add_item(cl_syoscb_item item)
Perform some basic bookkeping that is the same for all sequence items after insertion.
The UVM scoreboard item which wraps uvm_sequence_item .
virtual bit delete_item(cl_syoscb_proxy_item_base proxy_item)
Queue API: See cl_syoscb_queue_base::delete_item for more details
virtual cl_syoscb_queue_locator_base get_locator()
Queue API: See cl_syoscb_queue_base::get_locator for more details
virtual void decr_cnt_producer(string producer)
Decrement the producer counter for a given producer.
Locator base class defining the locator API used for searching in queues.
semaphore iter_sem
Semaphore guarding exclusive access to the queue when multiple iterators are in play.
Queue iterator base class defining the iterator API used for iterating over queues.
virtual cl_syoscb_item pre_add_item(string producer, uvm_sequence_item item)
Perform some basic bookkeeping that is the same for all sequence items before insertion.
virtual bit empty()
Queue API: See cl_syoscb_queue_base::empty for more details
Class which represents the base concept of a queue.
Standard implementation of a queue.
cl_syoscb_item items[$]
Simple queue implementation with a SV queue.
virtual int unsigned get_size()
Queue API: See cl_syoscb_queue_base::get_size for more details
virtual bit insert_item(string producer, uvm_sequence_item item, int unsigned idx)
Queue API: See cl_syoscb_queue_base::insert_item for more details
virtual cl_syoscb_item get_item(cl_syoscb_proxy_item_base proxy_item)
Queue API: See cl_syoscb_queue_base::get_item for more details
virtual cl_syoscb_queue_iterator_base create_iterator(string name="")
Queue API: See cl_syoscb_queue_base::create_iterator for more details
virtual bit delete_iterator(cl_syoscb_queue_iterator_base iterator)
Queue API: See cl_syoscb_queue_base::delete_iterator for more details
Proxy item implementation for standard queues.