15 protected bit
go = 1'b1;
41 `uvm_object_utils_begin(cl_syoscb_compare_base)
42 `uvm_field_object(cfg, UVM_DEFAULT| UVM_REFERENCE)
43 `uvm_field_int(do_split, UVM_DEFAULT)
44 `uvm_field_int(go, UVM_DEFAULT)
45 `uvm_field_int(disable_compare, UVM_DEFAULT)
46 `uvm_field_string(primary_queue_name, UVM_DEFAULT)
47 `uvm_field_object(primary_queue, UVM_DEFAULT)
48 `uvm_field_array_string(secondary_queue_names, UVM_DEFAULT)
49 `uvm_field_aa_object_string(secondary_item_found, UVM_DEFAULT)
50 `uvm_field_object(primary_item_proxy, UVM_DEFAULT)
51 `uvm_field_object(primary_queue_iter, UVM_DEFAULT)
52 `uvm_field_string(current_queue_name, UVM_DEFAULT)
53 `uvm_field_object(current_item, UVM_DEFAULT)
59 extern function new(string name = "cl_syoscb_compare_base");
66 cl_syoscb_item item = null);
67 extern
virtual function void
compare_main(t_scb_compare_greed greed);
72 extern
protected virtual function void
init();
73 extern
protected virtual function void
compare_do_greed(t_scb_compare_greed greed);
75 extern
protected virtual function void
compare_do();
79 extern
protected virtual function void
count_producers(string producer = "");
86 extern
protected virtual function bit
delete();
94 extern
virtual function void
set_cfg(cl_syoscb_cfg cfg);
97 cl_syoscb_item secondary_item,
98 string sec_queue_name,
99 uvm_comparer comparer,
102 extern
virtual function void
do_copy(uvm_object rhs);
103 extern
virtual function void do_print(uvm_printer printer);
104 extern
virtual function bit do_compare(uvm_object rhs,
105 uvm_comparer comparer);
108 function cl_syoscb_compare_base::new(string name = "cl_syoscb_compare_base");
122 cl_syoscb_item item = null);
123 if(this.disable_compare == 1'b0) begin
124 if(item == null) begin
125 `uvm_fatal("COMPARE_ERROR", $sformatf("[%s]: The in-order by producer requires to know the current inserted item", this.cfg.get_scb_name()));
152 if(this.do_split == 1'b1) begin
166 int unsigned item_before_compare = 0;
174 if(this.go == 1'b1) begin
175 int unsigned nbr_errors;
181 if(this.cfg.get_disable_compare_after_error() && (this.num_uvm_errors()>nbr_errors)) begin
182 `uvm_info("DEBUG", $sformatf("[%s]: Disabling compare as error is detected and disable compare after error is enabled", this.cfg.get_scb_name()), UVM_FULL);
187 while( greed == pk_syoscb::SYOSCB_COMPARE_GREEDY &&
188 (item_before_compare - this.get_queues_item_cnt()) == (this.secondary_queues.size()+1));
214 return this.
cfg.get_primary_queue();
222 if(!this.cfg.dynamic_primary_queue()) begin
231 if(this.secondary_queues.size() == 0 ||
232 this.secondary_queue_names.size() == 0) begin
233 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: No secondary queues found", this.cfg.get_scb_name()));
236 foreach(this.secondary_queues[i]) begin
237 if(this.secondary_queues[i] == null) begin
238 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: Unable to retrieve secondary queue handle", this.cfg.get_scb_name()));
241 `uvm_info("DEBUG", $sformatf("[%s]: Secondary queue: %s found", this.cfg.get_scb_name(), this.secondary_queue_names[i]), UVM_FULL);
251 if(this.primary_queue.empty() == 1'b0) begin
258 this.
go = (empties.size()>0) ? 1'b0 : 1'b1;
273 if(this.go == 1'b1) begin
275 if(producer == "") begin
284 producers = this.
secondary_queues.find(x) with (x.exists_cnt_producer(prod) == 1'b1);
286 this.
go = (this.primary_queue.exists_cnt_producer(prod) &&
287 producers.size() == this.secondary_queues.size()) ? 1'b1 : 1'b0;
289 if(this.go == 1'b1) begin
292 cnt_producers = this.
secondary_queues.find(x) with (x.get_cnt_producer(prod) > 0);
294 this.
go = ((this.primary_queue.get_cnt_producer(prod)>0) &&
295 (cnt_producers.size() == this.secondary_queues.size())) ? 1'b1 : 1'b0;
305 if(this.secondary_item_found.size() == this.secondary_queue_names.size()) begin
306 `uvm_info("DEBUG", $sformatf("[%s]: cmp: Found match for primary queue item :\n%s", this.cfg.get_scb_name(), cl_syoscb_string_library::sprint_item(this.primary_queue.get_item(this.primary_item_proxy), this.cfg)), UVM_FULL);
309 if(!this.primary_queue.delete_item(this.primary_item_proxy)) begin
310 `uvm_error("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to delete item from queue %s",
311 this.cfg.get_scb_name(),this.primary_queue_name));
315 foreach(this.secondary_queue_names[i]) begin
316 if(this.secondary_queues[i] == null) begin
317 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to retrieve secondary queue handle", this.cfg.get_scb_name()));
320 if(!this.secondary_queues[i].delete_item(this.secondary_item_found[this.secondary_queue_names[i]])) begin
321 `uvm_error("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to delete item from queue %s",
322 this.cfg.get_scb_name(), this.secondary_queue_names[i]));
344 int unsigned item_count = 0;
345 string l_queue_names[];
348 this.
cfg.get_queues(l_queue_names);
350 foreach(l_queue_names[i]) begin
351 l_queue = this.
cfg.get_queue(l_queue_names[i]);
353 item_count = item_count + l_queue.get_size();
362 `uvm_fatal("IMPL_ERROR", $sformatf("[%s]: cl_syoscb_compare_base::primary_loop_do() *MUST* be overwritten", this.cfg.get_scb_name()));
368 `uvm_fatal("IMPL_ERROR", $sformatf("[%s]: cl_syoscb_compare_base::secondary_loop_do() *MUST* be overwritten", this.cfg.get_scb_name()));
375 string queue_names[];
380 this.
cfg.get_queues(queue_names);
383 if(this.primary_queue == null) begin
384 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to retrieve primary queue handle", this.cfg.get_scb_name()));
386 foreach(queue_names[i]) begin
387 if(queue_names[i] != this.get_primary_queue_name()) begin
399 string queue_names[];
404 this.
cfg.get_queues(queue_names);
406 foreach(queue_names[i]) begin
410 if(this.primary_queue == null) begin
411 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to retrieve primary queue handle", this.cfg.get_scb_name()));
417 queue_first = this.
cfg.get_queue(queue_names[i]);
418 if(queue_first == null) begin
419 `uvm_fatal("QUEUE_ERROR", $sformatf("[%s]: cmp: Unable to retrieve primary queue handle", this.cfg.get_scb_name()));
425 if(queue_first.get_size() < this.primary_queue.get_size()) begin
426 this.secondary_queue_names[this.secondary_queue_names.size()-1] = primary_queue_name;
427 this.secondary_queues[this.secondary_queues.size()-1] = primary_queue;
428 this.primary_queue = queue_first;
429 this.primary_queue_name = queue_names[i];
431 this.secondary_queue_names[this.secondary_queue_names.size()-1] = queue_names[i];
432 this.secondary_queues[this.secondary_queues.size()-1] = queue_first;
439 function void cl_syoscb_compare_base::create_primary_iterator();
443 this.primary_queue_iter = this.primary_queue.get_iterator("default");
447 if(this.primary_queue_iter == null) begin
448 this.primary_queue_iter = this.primary_queue.create_iterator("default");
452 $sformatf("[%s]: cmp: primary queue: %s",
453 this.cfg.get_scb_name(), this.primary_queue.get_name()), UVM_FULL);
455 $sformatf("[%s]: cmp: number of queues: %0d",
456 this.cfg.get_scb_name(), this.secondary_queue_names.size()+1), UVM_FULL);
458 void'(this.primary_queue_iter.first());
459 endfunction: create_primary_iterator
463 function void cl_syoscb_compare_base::primary_loop_init();
464 endfunction: primary_loop_init
467 function int cl_syoscb_compare_base::num_uvm_errors();
468 uvm_report_server rs;
469 rs = uvm_report_server::get_server();
471 return rs.get_severity_count(UVM_ERROR);
472 endfunction: num_uvm_errors
476 function void cl_syoscb_compare_base::set_cfg(cl_syoscb_cfg cfg);
481 function cl_syoscb_cfg cl_syoscb_compare_base::get_cfg();
496 function string cl_syoscb_compare_base::generate_miscmp_table(cl_syoscb_item primary_item,
497 cl_syoscb_item secondary_item,
498 string sec_queue_name,
499 uvm_comparer comparer,
509 table_width = cl_syoscb_string_library::generate_cmp_table_body('{primary_item, secondary_item}, this.cfg, miscmp_table);
512 header = cl_syoscb_string_library::generate_cmp_table_header(
514 $sformatf("[%0s]: %0s: Item from primary queue (%0s) not found in secondary queue (%0s)",
515 this.cfg.get_scb_name(),
517 this.primary_queue_name,
523 ecr = this.cfg.get_enable_comparer_report(sec_queue_name, secondary_item.get_producer());
525 footer = cl_syoscb_string_library::generate_cmp_table_footer(table_width, comparer);
530 return {header, miscmp_table, footer};
531 endfunction: generate_miscmp_table
534 function void cl_syoscb_compare_base::do_copy(uvm_object rhs);
535 cl_syoscb_compare_base rhs_cast;
540 if(!$cast(rhs_cast, rhs)) begin
541 `uvm_fatal("DO_COPY", "Cast of rhs failed")
544 this.secondary_queues = new[rhs_cast.secondary_queues.size()];
547 foreach(this.secondary_queues[i]) begin
548 this.secondary_queues[i] = rhs_cast.secondary_queues[i];
553 function void cl_syoscb_compare_base::do_print(uvm_printer printer);
554 super.do_print(printer);
556 foreach(this.secondary_queues[i]) begin
557 this.secondary_queues[i].print(printer);
559 endfunction: do_print
562 function bit cl_syoscb_compare_base::do_compare(uvm_object rhs,
563 uvm_comparer comparer);
564 cl_syoscb_compare_base rhs_cast;
565 bit compare_bit = super.do_compare(rhs, comparer);
568 if(!$cast(rhs_cast, rhs)) begin
569 `uvm_fatal("DO_COMPARE", "Cast of rhs failed")
574 if(compare_bit) begin
582 compare_bit &= comparer.compare_field_int("secondary_queue_size",
583 this.secondary_queues.size(),
584 rhs_cast.secondary_queues.size(),
588 if(compare_bit) begin
589 foreach(this.secondary_queues[i]) begin
590 compare_bit &= comparer.compare_object("secondary_queues",
591 this.secondary_queues[i],
592 rhs_cast.secondary_queues[i]);
597 endfunction: do_compare
virtual cl_syoscb_cfg get_cfg()
Gets the scoreboard configuration object associated with this scoreboard.
virtual void compare_init()
Compare Strategy API: Verifies if the conditions for starting a compare are met:Verify that all queue...
cl_syoscb_queue_iterator_base primary_queue_iter
Iterator into primary queue.
virtual int num_uvm_errors()
Returns the number of UVM_ERROR messages that have been generated so far.
virtual void compare_do()
Compare Strategy API: Starts the actual comparison operationPerform initialization on the primary que...
virtual void count_producers(string producer="")
Compare Strategy API: Checks if the producer of the current item exists in all other queues...
virtual void dynamic_queue_split_do()
Compare Strategy API: Splits queues into primary and secondary when a primary queue has not been spec...
The UVM scoreboard item which wraps uvm_sequence_item .
cl_syoscb_queue_base secondary_queues[]
Handles to secondary queues.
virtual void check_queues()
Compare Strategy API: Check if any queue is empty.
Base class for all proxy items.
Base class for all compare algorithms.
virtual bit delete()
Compare Strategy API: Deletes matched items from the primary and all secondary queues if a match was ...
virtual void secondary_loop_do()
Compare Strategy API: Loop over all secondary queues to find a match for the primary item...
bit go
Indicates whether a comparison can be started (1) or not (0)
cl_syoscb_proxy_item_base secondary_item_found[string]
Associative array used to indicate if a matching item was found in a secondary queue.
virtual void compare_control(bit cc)
Compare API: Toggle comparisons on or off
virtual int unsigned get_queues_item_cnt()
Compare Strategy API: Gets the total number of items in all the queues at the moment of the function ...
virtual void create_primary_iterator()
Compare Strategy API: Creates the iterator for the primary queue and sets the pointer to its first el...
bit disable_compare
If set to 1'b1, no comparisons are performed. If 1'b0, comparisons are executed.
virtual void set_cfg(cl_syoscb_cfg cfg)
Set the scoreboard configuration associated with this comparer's scoreboard.
string secondary_queue_names[]
Names of secondary queues.
cl_syoscb_proxy_item_base primary_item_proxy
Proxy item for the item being searched for in all secondary queue.
virtual void split_queues()
Compare Strategy API: Splits the scoreboard's queues into 1 primary queue and N-1 secondary queues...
virtual void compare_main(t_scb_compare_greed greed)
Compare API: Main function that contains all the actual compare operations requested by the compare a...
Queue iterator base class defining the iterator API used for iterating over queues.
string primary_queue_name
Name of primary queue.
virtual string get_primary_queue_name()
Compare Strategy API: Gets the name of this scoreboard's primary queue.
virtual void static_queue_split_do()
Compare Strategy API: Splits queues into primary and secondary when a primary queue has been specifie...
cl_syoscb_queue_base primary_queue
Handle to primary queue.
virtual void compare_trigger(string queue_name="", cl_syoscb_item item=null)
Compare API: Starts a comparison by calling compare_main if comparisons are not disabled.
virtual string generate_miscmp_table(cl_syoscb_item primary_item, cl_syoscb_item secondary_item, string sec_queue_name, uvm_comparer comparer, string cmp_name)
Generates a side-by-side comparison of the seq.
bit do_split
Indicates how queues should be split into a primary queue and array of secondary queues.
Class which represents the base concept of a queue.
cl_syoscb_cfg cfg
Handle to the configuration object.
virtual string get_count_producer()
Compare Strategy API: Returns the name of the producer that the compare method should evaluate in ord...
virtual void primary_loop_init()
Compare Strategy API: Contains all the operations to be executed immediately before starting the prim...
virtual void do_copy(uvm_object rhs)
Custom do_dopy implementation for secondary queues.
virtual void primary_loop_do()
Compare Strategy API: Loop over the primary queue, selecting primary items to compare against items i...
cl_syoscb_item current_item
Handle to the item passed in by cl_syoscb::add_item.
string current_queue_name
Name of the queue currently being searched.
virtual void compare_do_greed(t_scb_compare_greed greed)
Compare Strategy API: Try to remove a match and drain all the potential remaining matches inside the ...
Configuration class for the SyoSil UVM scoreboard.
virtual void init()
Compare Strategy API: Executes some preliminary common operations before starting comparisons:Split q...