cl_syoscb.svh

Go to the documentation of this file.
00001 class cl_syoscb extends uvm_scoreboard;
00002    cl_syoscb_cfg cfg;
00003    cl_syoscb_queue queues[];
00004    cl_syoscb_compare compare_strategy;
00005 
00006    `uvm_component_utils_begin(cl_syoscb)
00007      `uvm_field_object(cfg, UVM_ALL_ON)
00008      `uvm_field_array_object(queues, UVM_ALL_ON)
00009      `uvm_field_object(compare_strategy, UVM_ALL_ON)
00010    `uvm_component_utils_end
00011 
00012    extern function new(string name, uvm_component parent);
00013    extern function void build_phase(uvm_phase phase);
00014    extern function void check_phase(uvm_phase phase);
00015    extern function void report_phase(uvm_phase phase);
00016    extern function bit compare();
00017    extern function void add_item(string queue_name, string producer, uvm_sequence_item item);
00018 endclass: cl_syoscb
00019 
00020 function cl_syoscb::new(string name, uvm_component parent);
00021    super.new(name, parent);
00022 endfunction : new
00023 
00024 function void cl_syoscb::build_phase(uvm_phase phase);
00025    // TBD: This contradicts the paper. It states that a default one is created
00026    // TBD push config further down?
00027    if (!uvm_config_db #(cl_syoscb_cfg)::get(this, "", "cfg", this.cfg))
00028      `uvm_fatal("CFG", "Configuration object not passed.")
00029    // TBD: This is snooping directly in the CFG - use get/set functions instead?
00030    this.queues = new[this.cfg.queues.size()];
00031    begin
00032      int unsigned idx = 0;
00033      foreach(this.cfg.queues[queue_name]) begin
00034       this.queues[idx] = cl_syoscb_queue::type_id::create({"queue", $psprintf("%0d",idx)}, this);
00035          this.cfg.queues[queue_name] = this.queues[idx++];
00036       end
00037    end
00038 
00039    this.compare_strategy = cl_syoscb_compare::type_id::create(.name("compare_strategy"), .parent(this));
00040 
00041    // TBD: This should either be passed as args to constructor
00042    //      or the objects should query the CFG DB directly if possible
00043    //      The parent path is not available anymore after we changed to uvm_object
00044    this.compare_strategy.compare_algo.set_cfg(this.cfg);
00045       
00046    begin
00047       cl_syoscb_report_catcher catcher = new();
00048       uvm_report_cb::add(null, catcher);
00049    end
00050 endfunction : build_phase
00051 
00052 function bit cl_syoscb::compare();
00053    return(this.compare_strategy.compare());
00054 endfunction: compare
00055 
00056 ///////////////////////////////////////
00057 // Function based API
00058 ///////////////////////////////////////
00059 function void cl_syoscb::add_item(string queue_name, string producer, uvm_sequence_item item);
00060    // TBD: Add checks of correct queue and producer
00061    if(!this.cfg.queues[queue_name].add_item(producer, item)) begin
00062      `uvm_fatal("QUEUE_ERROR", $sformatf("Unable to add item to queue: %s", queue_name));
00063    end
00064 
00065    // TBD: This should be revised according to how it was in the old SCB
00066    // TBD: Return value from compare() should also be handled
00067    void'(this.compare());
00068 endfunction : add_item
00069 
00070 ///////////////////////////////////////
00071 // Transaction based API
00072 ///////////////////////////////////////
00073 // TBD
00074 
00075 function void cl_syoscb::check_phase(uvm_phase phase);
00076    string queue_names[];
00077    cl_syoscb_queue_std queue;
00078    super.check_phase(phase);
00079 
00080    this.cfg.get_queues(queue_names);
00081    foreach (queue_names[i]) begin
00082       $cast(queue, this.cfg.queues[queue_names[i]]);
00083       if (queue.items.size()!=0) begin
00084          string firstitem = queue.items[0].sprint();
00085          `uvm_error("SYOSCB", $psprintf("Queue %s not empty, entries : %d, first element : \n%s", queue_names[i], queue.items.size(), firstitem));
00086          // TBD dump first parts of each queue !
00087          // will we use std UVM report mechanisms or a special channel we can redirect ?
00088       end
00089    end
00090 endfunction : check_phase
00091 
00092 function void cl_syoscb::report_phase(uvm_phase phase);
00093    super.report_phase(phase);
00094    // TBD this should NOT  call the report phase of the compare method !
00095    // as cl_syoscb_compare_base extends uvm_component the compare method should just perform its end of test checks in
00096    // uvm_check_phase, from the UVM 1.1 class ref manual:
00097    // uvm_build_phase      Create and configure of testbench structure
00098    // uvm_connect_phase      Establish cross-component connections.
00099    // uvm_end_of_elaboration_phase      Fine-tune the testbench.
00100    // uvm_start_of_simulation_phase      Get ready for DUT to be simulated.
00101    // uvm_run_phase      Stimulate the DUT.
00102    // uvm_extract_phase      Extract data from different points of the verficiation environment.
00103    // uvm_check_phase      Check for any unexpected conditions in the verification environment.
00104    // uvm_report_phase      Report results of the test.
00105    // uvm_final_phase      Tie up loose ends.
00106 endfunction : report_phase
 All Classes Namespaces Files Functions Variables

Project: SyoSil ApS UVM Scoreboard, Revision: 1.0.0.2
Copyright 2014 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
Wed Feb 25 04:01:40 2015
Find a documentation bug? Report bugs to: bugs.intelligentdv.com Project: DoxygenFilterSV