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

📄 xbus_example_master_seq_lib.sv

📁 This is OVM 2.0 source code .Very useful for developing system verilog Env
💻 SV
字号:
// $Id: xbus_example_master_seq_lib.sv,v 1.10 2008/08/25 14:48:29 redelman Exp $//----------------------------------------------------------------------//   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.//----------------------------------------------------------------------//------------------------------------------------------------------------------//// SEQUENCE: incr_read_byte_seq////------------------------------------------------------------------------------class incr_read_byte_seq extends ovm_sequence #(xbus_transfer);  function new(string name="incr_read_byte_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(incr_read_byte_seq, xbus_master_sequencer)  read_byte_seq read_byte_seq0;  rand int unsigned count;    constraint count_ct { (count < 20); }  rand bit [15:0] start_address;  rand int unsigned incr_transmit_del = 0;    constraint transmit_del_ct { (incr_transmit_del <= 10); }    virtual task body();    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting with count = %0d",       get_sequence_path(), count), OVM_MEDIUM);    repeat(count) begin : repeat_block      `ovm_do_with(read_byte_seq0,        { read_byte_seq0.start_addr == start_address;          read_byte_seq0.transmit_del == incr_transmit_del; } )      start_address++;    end : repeat_block  endtask : body  endclass : incr_read_byte_seq//------------------------------------------------------------------------------//// SEQUENCE: incr_write_byte_seq////------------------------------------------------------------------------------class incr_write_byte_seq extends ovm_sequence #(xbus_transfer);  function new(string name="incr_write_byte_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(incr_write_byte_seq, xbus_master_sequencer)      write_byte_seq write_byte_seq0;  rand int unsigned count;    constraint count_ct { (count < 20); }  rand bit [15:0] start_address;  rand int unsigned incr_transmit_del = 0;    constraint transmit_del_ct { (incr_transmit_del <= 10); }  virtual task body();    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting with count = %0d",      get_sequence_path(), count), OVM_MEDIUM);    repeat(count) begin : repeat_block      `ovm_do_with(write_byte_seq0,        { write_byte_seq0.start_addr == start_address;          write_byte_seq0.transmit_del == incr_transmit_del; } )      start_address++;    end : repeat_block  endtask : bodyendclass : incr_write_byte_seq//------------------------------------------------------------------------------//// SEQUENCE: incr_read_write_read_seq////------------------------------------------------------------------------------class incr_read_write_read_seq extends ovm_sequence #(xbus_transfer);  function new(string name="incr_read_write_read_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(incr_read_write_read_seq, xbus_master_sequencer)  incr_read_byte_seq  read0;  incr_write_byte_seq write0;  virtual task body();    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting sequence",      get_sequence_path()), OVM_MEDIUM);    `ovm_do(read0)    `ovm_do(write0)    `ovm_do(read0)  endtask : bodyendclass : incr_read_write_read_seq//------------------------------------------------------------------------------//// SEQUENCE: r8_w8_r4_w4_seq////------------------------------------------------------------------------------class r8_w8_r4_w4_seq extends ovm_sequence #(xbus_transfer);  function new(string name="r8_w8_r4_w4_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(r8_w8_r4_w4_seq, xbus_master_sequencer)      read_word_seq read_word_seq0;  read_double_word_seq read_double_word_seq0;  write_word_seq write_word_seq0;  write_double_word_seq write_double_word_seq0;  rand bit [15:0] start_address;  constraint start_address_ct { (start_address == 16'h4000); }  virtual task body();    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting...",      get_sequence_path()), OVM_MEDIUM);    `ovm_do_with(read_double_word_seq0,       { read_double_word_seq0.start_addr == start_address;        read_double_word_seq0.transmit_del == 2; } )    `ovm_do_with(write_double_word_seq0,      { write_double_word_seq0.start_addr == start_address;        write_double_word_seq0.transmit_del == 4; } )    start_address = start_address + 8;    `ovm_do_with(read_word_seq0,      { read_word_seq0.start_addr == start_address;        read_word_seq0.transmit_del == 6; } )    `ovm_do_with(write_word_seq0,      { write_word_seq0.start_addr == start_address;        write_word_seq0.transmit_del == 8; } )  endtask : bodyendclass : r8_w8_r4_w4_seq  //------------------------------------------------------------------------------//// SEQUENCE: read_modify_write_seq////------------------------------------------------------------------------------class read_modify_write_seq extends ovm_sequence #(xbus_transfer);  function new(string name="read_modify_write_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(read_modify_write_seq, xbus_master_sequencer)      read_byte_seq read_byte_seq0;  write_byte_seq write_byte_seq0;  rand bit [15:0] addr_check;  bit [7:0] m_data0_check;  virtual task body();    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting...",      get_sequence_path()), OVM_MEDIUM);    // READ A RANDOM LOCATION    `ovm_do(read_byte_seq0)    addr_check = read_byte_seq0.rsp.addr;    m_data0_check = read_byte_seq0.rsp.data[0] + 1;    // WRITE MODIFIED READ DATA    `ovm_do_with(write_byte_seq0,      { write_byte_seq0.start_addr == addr_check;        write_byte_seq0.data0 == m_data0_check; } )    // READ MODIFIED WRITE DATA    `ovm_do_with(read_byte_seq0,      { read_byte_seq0.start_addr == addr_check; } )    assert(m_data0_check == read_byte_seq0.rsp.data[0]) else      p_sequencer.ovm_report_error(get_type_name(),        $psprintf("%s Read Modify Write Read error!",         get_sequence_path()));  endtask : bodyendclass : read_modify_write_seq//------------------------------------------------------------------------------//// SEQUENCE: loop_read_modify_write_seq////------------------------------------------------------------------------------class loop_read_modify_write_seq extends ovm_sequence #(xbus_transfer);  int itr;  function new(string name="loop_read_modify_write_seq");    super.new(name);  endfunction : new  `ovm_sequence_utils(loop_read_modify_write_seq, xbus_master_sequencer)      read_modify_write_seq rmw_seq;  virtual task body();    void'(p_sequencer.get_config_int("loop_read_modify_write_seq.itr", itr));    p_sequencer.ovm_report_info(get_type_name(),      $psprintf("%s starting...",      get_sequence_path()), OVM_MEDIUM);    for(int i = 0; i < itr; i++) begin      `ovm_do(rmw_seq)    end  endtask : bodyendclass : loop_read_modify_write_seq

⌨️ 快捷键说明

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