// //----------------------------------------------------------------------------- // Copyright 2007-2014 Mentor Graphics Corporation // Copyright 2015 Analog Devices, Inc. // Copyright 2014 Intel Corporation // Copyright 2007-2018 Cadence Design Systems, Inc. // Copyright 2013-2015 NVIDIA Corporation // Copyright 2017 Cisco Systems, Inc. // 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. //----------------------------------------------------------------------------- //------------------------------------------------------------------------------ // File -- NODOCS -- Transaction Recording Databases // // The UVM "Transaction Recording Database" classes are an abstract representation // of the backend tool which is recording information for the user. Usually this // tool would be dumping information such that it can be viewed with the ~waves~ // of the DUT. // typedef class uvm_recorder; typedef class uvm_tr_stream; typedef class uvm_link_base; //------------------------------------------------------------------------------ // // CLASS -- NODOCS -- uvm_tr_database // // The ~uvm_tr_database~ class is intended to hide the underlying database implementation // from the end user, as these details are often vendor or tool-specific. // // The ~uvm_tr_database~ class is pure virtual, and must be extended with an // implementation. A default text-based implementation is provided via the // class. // // @uvm-ieee 1800.2-2017 auto 7.1.1 virtual class uvm_tr_database extends uvm_object; // Variable- m_is_opened // Tracks the opened state of the database local bit m_is_opened; // Variable- m_streams // Used for tracking streams which are between the open and closed states local bit m_streams[uvm_tr_stream]; // @uvm-ieee 1800.2-2017 auto 7.1.2 function new(string name="unnamed-uvm_tr_database"); super.new(name); endfunction : new // Group -- NODOCS -- Database API // @uvm-ieee 1800.2-2017 auto 7.1.3.1 function bit open_db(); if (!m_is_opened) m_is_opened = do_open_db(); return m_is_opened; endfunction : open_db // @uvm-ieee 1800.2-2017 auto 7.1.3.2 function bit close_db(); if (m_is_opened) begin if (do_close_db()) m_is_opened = 0; end return (m_is_opened == 0); endfunction : close_db // @uvm-ieee 1800.2-2017 auto 7.1.3.3 function bit is_open(); return m_is_opened; endfunction : is_open // Group -- NODOCS -- Stream API // @uvm-ieee 1800.2-2017 auto 7.1.4.1 function uvm_tr_stream open_stream(string name, string scope="", string type_name=""); if (!open_db()) begin return null; end else begin process p = process::self(); string s; if (p != null) s = p.get_randstate(); open_stream = do_open_stream(name, scope, type_name); if (open_stream != null) begin m_streams[open_stream] = 1; open_stream.m_do_open(this, scope, type_name); end if (p != null) p.set_randstate(s); end endfunction : open_stream // Function- m_free_stream // Removes stream from the internal array function void m_free_stream(uvm_tr_stream stream); if (m_streams.exists(stream)) m_streams.delete(stream); endfunction : m_free_stream // @uvm-ieee 1800.2-2017 auto 7.1.4.2 function unsigned get_streams(ref uvm_tr_stream q[$]); // Clear out the queue first... q.delete(); // Then fill in the values foreach (m_streams[idx]) q.push_back(idx); // Finally, return the size of the queue return q.size(); endfunction : get_streams // Group -- NODOCS -- Link API // @uvm-ieee 1800.2-2017 auto 7.1.5 function void establish_link(uvm_link_base link); uvm_tr_stream s_lhs, s_rhs; uvm_recorder r_lhs, r_rhs; uvm_object lhs = link.get_lhs(); uvm_object rhs = link.get_rhs(); uvm_tr_database db; if (lhs == null) begin `uvm_warning("UVM/TR_DB/BAD_LINK", "left hand side '' is not supported in links for 'uvm_tr_database'") return; end if (rhs == null) begin `uvm_warning("UVM/TR_DB/BAD_LINK", "right hand side '' is not supported in links for 'uvm_tr_database'") return; end if (!$cast(s_lhs, lhs) && !$cast(r_lhs, lhs)) begin `uvm_warning("UVM/TR_DB/BAD_LINK", $sformatf("left hand side of type '%s' not supported in links for 'uvm_tr_database'", lhs.get_type_name())) return; end if (!$cast(s_rhs, rhs) && !$cast(r_rhs, rhs)) begin `uvm_warning("UVM/TR_DB/BAD_LINK", $sformatf("right hand side of type '%s' not supported in links for 'uvm_record_datbasae'", rhs.get_type_name())) return; end if (r_lhs != null) begin s_lhs = r_lhs.get_stream(); end if (r_rhs != null) begin s_rhs = r_rhs.get_stream(); end if ((s_lhs != null) && (s_lhs.get_db() != this)) begin db = s_lhs.get_db(); `uvm_warning("UVM/TR_DB/BAD_LINK", $sformatf("attempt to link stream from '%s' into '%s'", db.get_name(), this.get_name())) return; end if ((s_rhs != null) && (s_rhs.get_db() != this)) begin db = s_rhs.get_db(); `uvm_warning("UVM/TR_DB/BAD_LINK", $sformatf("attempt to link stream from '%s' into '%s'", db.get_name(), this.get_name())) return; end do_establish_link(link); endfunction : establish_link // Group -- NODOCS -- Implementation Agnostic API // // @uvm-ieee 1800.2-2017 auto 7.1.6.1 pure virtual protected function bit do_open_db(); // @uvm-ieee 1800.2-2017 auto 7.1.6.2 pure virtual protected function bit do_close_db(); // @uvm-ieee 1800.2-2017 auto 7.1.6.3 pure virtual protected function uvm_tr_stream do_open_stream(string name, string scope, string type_name); // @uvm-ieee 1800.2-2017 auto 7.1.6.4 pure virtual protected function void do_establish_link(uvm_link_base link); endclass : uvm_tr_database