cl_syoscb_compare_io.svh

00001 /// Class which implements the in order compare algorithm
00002 class cl_syoscb_compare_io extends cl_syoscb_compare_base;
00003   //-------------------------------------
00004   // UVM Macros
00005   //-------------------------------------
00006   `uvm_object_utils(cl_syoscb_compare_io)
00007 
00008   //-------------------------------------
00009   // Constructor
00010   //-------------------------------------
00011   extern function new(string name = "cl_syoscb_compare_io");
00012 
00013   //-------------------------------------
00014   // Compare API
00015   //-------------------------------------
00016   extern virtual function void compare();
00017   extern function void compare_do();
00018 endclass: cl_syoscb_compare_io
00019 
00020 function cl_syoscb_compare_io::new(string name = "cl_syoscb_compare_io");
00021   super.new(name);
00022 endfunction: new
00023 
00024 /// <b>Compare API</b>: Mandatory overwriting of the base class' compare method.
00025 /// Currently, this just calls do_copy() blindly 
00026 function void cl_syoscb_compare_io::compare();
00027   // Here any state variables should be queried
00028   // to compute if the compare should be done or not
00029   this.compare_do();
00030 endfunction: compare
00031 
00032 /// <b>Compare API</b>: Mandatory overwriting of the base class' do_compare method.
00033 /// Here the actual in order compare is implemented.
00034 ///
00035 /// The algorithm gets the primary queue and then loops over all other queues to see if
00036 /// it can find primary item as the first item in all of the other queues. If so then the items
00037 /// are removed from all queues. If not then a UVM error is issued.
00038 function void cl_syoscb_compare_io::compare_do();
00039   string primary_queue_name;
00040   cl_syoscb_queue primary_queue;
00041   cl_syoscb_queue_iterator_base primary_queue_iter;
00042   string queue_names[];
00043   int unsigned secondary_item_found[string];
00044   bit compare_continue = 1'b1;
00045   bit compare_result = 1'b0;
00046   cl_syoscb_item primary_item;
00047 
00048   // Initialize state variables
00049   primary_queue_name = this.get_primary_queue_name();
00050   this.cfg.get_queues(queue_names);
00051 
00052   primary_queue = this.cfg.get_queue(primary_queue_name);
00053   if(primary_queue == null) begin
00054     `uvm_fatal("QUEUE_ERROR", "Unable to retrieve primary queue handle");
00055   end
00056 
00057   primary_queue_iter = primary_queue.create_iterator();
00058 
00059   `uvm_info("DEBUG", $sformatf("cmp-io: primary queue: %s", primary_queue_name), UVM_FULL);
00060   `uvm_info("DEBUG", $sformatf("cmp-io: number of queues: %0d", queue_names.size()), UVM_FULL);
00061 
00062   // Outer loop loops through all
00063   while(!primary_queue_iter.is_done()) begin
00064     primary_item = primary_queue_iter.get_item();
00065 
00066     `uvm_info("DEBUG", $sformatf("Now comparing primary transaction:\n%s", primary_item.sprint()), UVM_FULL); 
00067 
00068     // Inner loop through all queues
00069     foreach(queue_names[i]) begin
00070       `uvm_info("DEBUG", $sformatf("Looking at queue: %s", queue_names[i]), UVM_FULL);
00071 
00072       if(queue_names[i] != primary_queue_name) begin
00073         cl_syoscb_queue secondary_queue;
00074         cl_syoscb_queue_iterator_base secondary_queue_iter;
00075         cl_syoscb_item sih;
00076 
00077         `uvm_info("DEBUG", $sformatf("%s is a secondary queue - now comparing", queue_names[i]), UVM_FULL);
00078 
00079    // Get the secondary queue
00080         secondary_queue = this.cfg.get_queue(queue_names[i]);
00081 
00082         if(secondary_queue == null) begin
00083           `uvm_fatal("QUEUE_ERROR", "Unable to retrieve secondary queue handle");
00084         end
00085 
00086         `uvm_info("DEBUG", $sformatf("%0d items in queue: %s", secondary_queue.get_size(), queue_names[i]), UVM_FULL);
00087 
00088    // Get an iterator for the secondary queue
00089         secondary_queue_iter = secondary_queue.create_iterator();
00090 
00091         // Only do the compare if there are actually an item in the secondary queue
00092         if(!secondary_queue_iter.is_done()) begin
00093           // Get the first item from the secondary queue       
00094           sih = secondary_queue_iter.get_item();
00095 
00096           if(sih.compare(primary_item) == 1'b1) begin
00097             secondary_item_found[queue_names[i]] = secondary_queue_iter.get_idx();
00098             `uvm_info("DEBUG", $sformatf("Secondary item found at index: %0d:\n%s", secondary_queue_iter.get_idx(), sih.sprint()), UVM_FULL);
00099           end else begin
00100             `uvm_error("COMPARE_ERROR", $sformatf("Item:\n%s\nfrom primary queue: %s not found in secondary queue: %s. Found this item in %s instead:\n%s", primary_item.sprint(), primary_queue_name, queue_names[i], queue_names[i], sih.sprint()))
00101           end
00102         end else begin
00103           `uvm_info("DEBUG", "End of queue reached", UVM_FULL);
00104         end
00105 
00106         if(!secondary_queue.delete_iterator(secondary_queue_iter)) begin
00107           `uvm_fatal("QUEUE_ERROR", $sformatf("Unable to delete iterator from secondaery queue: %s", queue_names[i]));
00108         end
00109       end else begin
00110         `uvm_info("DEBUG", $sformatf("%s is the primary queue - skipping", queue_names[i]), UVM_FULL);
00111       end
00112     end
00113 
00114     // Only start to remove items if all slave items are found (One from each slave queue)
00115     if(secondary_item_found.size() == queue_names.size()-1) begin
00116       string queue_name;
00117       cl_syoscb_item pih;
00118 
00119       // Get the item from the primary queue
00120       pih = primary_queue_iter.get_item();
00121 
00122       `uvm_info("DEBUG", $sformatf("Found match for primary queue item :\n%s",
00123                                    pih.sprint()), UVM_FULL);
00124 
00125       // Remove from primary
00126       if(!primary_queue.delete_item(primary_queue_iter.get_idx())) begin
00127         `uvm_error("QUEUE_ERROR", $sformatf("Unable to delete item idx %0d from queue %s",
00128                                             primary_queue_iter.get_idx(), primary_queue.get_name()));
00129       end
00130 
00131       // Remove from all secondaries
00132       while(secondary_item_found.next(queue_name)) begin
00133         cl_syoscb_queue secondary_queue;
00134 
00135    // Get the secondary queue
00136         secondary_queue = this.cfg.get_queue(queue_name);
00137 
00138         if(secondary_queue == null) begin
00139           `uvm_fatal("QUEUE_ERROR", "Unable to retrieve secondary queue handle");
00140         end
00141 
00142         if(!secondary_queue.delete_item(secondary_item_found[queue_name])) begin
00143           `uvm_error("QUEUE_ERROR", $sformatf("Unable to delete item idx %0d from queue %s",
00144                                               secondary_item_found[queue_name], secondary_queue.get_name()));
00145         end
00146       end
00147     end
00148 
00149     // Call .next() blindly since we do not care about the
00150     // return value, since we might be at the end of the queue.
00151     // Thus, .next() will return 1'b0 at the end of the queue
00152     void'(primary_queue_iter.next());
00153   end
00154 
00155   if(!primary_queue.delete_iterator(primary_queue_iter)) begin
00156     `uvm_fatal("QUEUE_ERROR", $sformatf("Unable to delete iterator from primary queue: %s", primary_queue_name));
00157   end
00158 endfunction: compare_do
 All Classes Functions Variables

Project: SyoSil ApS UVM Scoreboard, Revision: 1.0.2.3

Copyright 2014-2015 SyoSil ApS
All Rights Reserved Worldwide

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
doxygen
Doxygen Version: 1.6.1
IDV SV Filter Version: 2.6.2
Mon Sep 28 02:57:58 2015
Find a documentation bug? Report bugs to: bugs.intelligentdv.com Project: DoxygenFilterSV