⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ovm_sequence.sv

📁 Open Verification Methodology
💻 SV
字号:
// $Id: //dvt/vtech/dev/main/ovm/src/methodology/sequences/ovm_sequence.sv#2 $//----------------------------------------------------------------------//   Copyright 2007-2008 Mentor Graphics Corporation//   Copyright 2007-2008 Cadence Design 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.//----------------------------------------------------------------------`include "methodology/sequences/ovm_sequence.svh"// new// ---function ovm_sequence::new (string name="ovm_sequence",    ovm_sequencer_base sequencer=null,  ovm_sequence parent_seq=null);  super.new(name, sequencer, parent_seq);  id = g_id++;endfunction// get_id// ------function int ovm_sequence::get_id();  return id;endfunction// m_set_b_sequencer// -----------------function void ovm_sequence::m_set_b_sequencer();  if($cast(b_sequencer, m_sequencer))    begin endendfunction// pre_body// --------task ovm_sequence::pre_body();  begin endendtask// body// ----task ovm_sequence::body();  begin endendtask// post_body// ---------task ovm_sequence::post_body();  begin endendtask// pre_do// ------task ovm_sequence::pre_do(bit is_item);  begin endendtask// mid_do// ------function void ovm_sequence::mid_do(ovm_sequence_item this_item);  begin endendfunction// post_do// -------function void ovm_sequence::post_do(ovm_sequence_item this_item);  begin endendfunction// wait_for_relevant// -----------------task ovm_sequence::wait_for_relevant();  event e;  wait_rel_default = 1;  if (is_rel_default != wait_rel_default)    ovm_report_fatal("RELMSM",       "is_relevant() was implemented without defining wait_for_relevant()");  @e;  // this is intended to never returnendtask// is_relevant// -----------function bit ovm_sequence::is_relevant();   is_rel_default = 1;  return 1;endfunction// is_item// -------function int ovm_sequence::is_item();   return 0;endfunction// get_sequence// ------------function ovm_sequence ovm_sequence::get_sequence(int req_kind);  ovm_sequence m_seq;  string m_seq_type;  if (req_kind < 0 || req_kind >= m_sequencer.sequences.size()) begin    ovm_report_error("SEQRNG",       $psprintf("Kind arg '%0d' out of range. Need 0-%0d",      req_kind,m_sequencer.sequences.size()-1));  end  m_seq_type = m_sequencer.sequences[req_kind];  if (!$cast(m_seq, ovm_factory::create_object(m_seq_type, get_full_name(),     m_seq_type)))   begin    ovm_report_fatal("FCTSEQ",       $psprintf("Factory can not produce a sequence of type %0s.",      m_seq_type));  end  m_seq.print_sequence_info = 1;  return m_seq;endfunction// get_seq_kind// --------function int ovm_sequence::get_seq_kind(string type_name);  if(m_sequencer)    return m_sequencer.get_seq_kind(type_name);  else     ovm_report_fatal("NULLSQ", $psprintf("%0s sequencer is null.",      get_type_name()));endfunction// do_sequence_kind// ----------------task ovm_sequence::do_sequence_kind(int unsigned req_kind);  string m_seq_type;  ovm_sequence m_seq ;  m_seq_type = m_sequencer.sequences[req_kind];  if (!$cast(m_seq, ovm_factory::create_object(m_seq_type, get_full_name(),    m_seq_type)))     ovm_report_fatal("FCTSEQ",       $psprintf("Factory can not produce a sequence of type %0s.", m_seq_type));  m_seq.print_sequence_info = 1;  m_seq.depth = this.depth + 1;  m_seq.set_parent_seq(this);  m_seq.set_sequencer(m_sequencer);  this.pre_do(0);   //randomize the sequence  assert(m_seq.randomize()) else $fatal;  this.mid_do(m_seq);  ->m_seq.started;  m_seq.body();  ->m_seq.ended;  this.post_do(m_seq);endtask// create_item// -----------function ovm_sequence_item ovm_sequence::create_item(  ovm_sequence_item type_var, ovm_sequencer_base l_sequencer);  if (!type_var.is_item()) begin    void'(l_sequencer.get_seq_kind(type_var.get_type_name()));  end  if (!$cast( type_var , ovm_factory::create_object( type_var.get_type_name(),    this.get_full_name(), type_var.get_name())))  begin    ovm_report_error("FCTRYF",       $psprintf("Factory could not produce an object of type %0s",      type_var.get_type_name()));  end  type_var.print_sequence_info = 1;  type_var.set_parent_seq(this);  type_var.set_sequencer(l_sequencer);  type_var.depth = this.depth + 1;  return type_var;endfunction// m_sync// ------task ovm_sequence::m_sync(ovm_sequence_item item);  ovm_event ack_process;  ack_process = new({"ack_", item.get_name()});  b_sequencer.m_sequencer_sync(item.get_name(), this, ack_process);  ack_process.wait_trigger();  #0;  if (m_sequencer.recording_detail != OVM_NONE) begin    //record sequence item into aggregate items stream    void'(m_sequencer.begin_tr(item, "aggregate items"));  endendtask// start_item// ----------task ovm_sequence::start_item(ovm_sequence_item type_var);  if (type_var.is_item()) begin     //register with sequencer and begin processing of ovm_sequence_item objects    this.m_sync(type_var);    this.pre_do(1);  end   //is sequence  else begin     if (m_sequencer.recording_detail != OVM_NONE)      //record sequences into m_get_root_sequence_name() stream      type_var.tr_handle = m_sequencer.begin_child_tr(        type_var,                          //ovm_transaction tr        type_var.m_parent_seq.tr_handle,   //parent tr_handle        m_get_root_sequence_name()         //string stream_name        );    this.pre_do(0);  endendtask// m_post_sync// -----------task ovm_sequence::m_post_sync(ovm_sequence_item item);  b_sequencer.m_last_push_front(item);  b_sequencer.m_item_ready_trigger(item);  b_sequencer.item_done_wait_trigger_data(item); /* wait until driver                                                  completes the item and                                                   signals item_done_trigger()                                                  */endtask// finish_item// -----------task ovm_sequence::finish_item( ovm_sequence_item type_var );  ovm_sequence m_seq;  //complete processing of ovm_sequence  //for ovm_sequence_item, call mid_do(), send to m_post_sync(), and post_do()  this.mid_do(type_var);  if(type_var.is_item()) begin    this.m_post_sync( type_var );  end  else begin //is sequence     //for ovm_sequence, call body()    $cast(m_seq, type_var);    //allow users to detect started when a subsequence body()    //calls ovm_do immediately    #0 -> m_seq.started;    m_seq.body();    -> m_seq.ended;  end  this.post_do(type_var);  m_sequencer.end_tr(type_var);endtask// grab()// ------                                                                                task ovm_sequence::grab(ovm_sequencer sequencer = null);  if (sequencer == null)    b_sequencer.grab(this);  else    sequencer.grab(this);endtask                                                                                                                                                                // ungrab()// ------                                                                                function void ovm_sequence::ungrab(ovm_sequencer sequencer = null);  if (sequencer == null)    b_sequencer.ungrab(this);  else    sequencer.ungrab(this);endfunction// is_blocked()// ------                                                                                function bit ovm_sequence::is_blocked();   return m_block_status;endfunction// m_set_is_blocked()// ------                                                                                function void ovm_sequence::m_set_is_blocked(bit block_status);   m_block_status = block_status;endfunction// stop()// ------                                                                                function void ovm_sequence::stop();   disable body;endfunction// pre_apply// ---------task ovm_sequence::pre_apply();  begin endendtask// mid_apply// ---------task ovm_sequence::mid_apply();  begin endendtask// post_apply// ---------task ovm_sequence::post_apply();  begin endendtask// apply// -----task ovm_sequence::apply(ovm_sequence_item req, output ovm_sequence_item  rsp);  b_sequencer.apply(req,this);  $cast(rsp, b_sequencer.item_done.get_trigger_data());endtask// start// -----task ovm_sequence::start(ovm_sequencer_base sequencer, ovm_sequence  parent_seq = null);  set_sequencer(sequencer);  set_parent_seq(parent_seq);  pre_body();  body();  post_body();endtask

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -