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

📄 xbus_master_driver.sv

📁 Open Verification Methodology
💻 SV
字号:
// $Id: //dvt/vtech/dev/main/ovm/examples/xbus/sv/xbus_master_driver.sv#4 $//----------------------------------------------------------------------//   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.//----------------------------------------------------------------------`ifndef XBUS_MASTER_DRIVER_SV`define XBUS_MASTER_DRIVER_SV//------------------------------------------------------------------------------//// CLASS: xbus_master_driver////------------------------------------------------------------------------------class xbus_master_driver extends ovm_driver;  // The virtual interface used to drive and view HDL signals.  virtual xbus_if xmi;  // Master Id  int master_id;  // Provide implmentations of virtual methods such as get_type_name and create  `ovm_component_utils(xbus_master_driver)  // new - constructor  function new (string name, ovm_component parent);    super.new(name, parent);  endfunction : new  // run phase  virtual task run();    fork      get_and_drive();      reset_signals();    join  endtask : run  // get_and_drive   virtual protected task get_and_drive();    ovm_sequence_item item;    xbus_transfer this_trans;    @(negedge xmi.sig_reset);    `message(OVM_MEDIUM,("Reset dropped"))    forever begin      @(posedge xmi.sig_clock);      seq_item_prod_if.get_next_item(item);      $cast(this_trans, item);      drive_transfer(this_trans);      seq_item_prod_if.item_done();    end  endtask : get_and_drive  // reset_signals  virtual protected task reset_signals();    forever begin      @(posedge xmi.sig_reset);      `message(OVM_MEDIUM, ("Reset observed"))      xmi.sig_request[master_id]  <= 0;      xmi.rw                      <= 'h0;      xmi.sig_addr           <= 'hz;      xmi.sig_data_out       <= 'hz;      xmi.sig_size           <= 'bz;      xmi.sig_read           <= 'bz;      xmi.sig_write          <= 'bz;      xmi.sig_bip            <= 'bz;    end  endtask : reset_signals  // drive_transfer  virtual protected task drive_transfer (xbus_transfer trans);    if (trans.transmit_delay > 0) begin      repeat(trans.transmit_delay) @(posedge xmi.sig_clock);    end    arbitrate_for_bus();    drive_address_phase(trans);    drive_data_phase(trans);  endtask : drive_transfer  // arbitrate_for_bus  virtual protected task arbitrate_for_bus();    xmi.sig_request[master_id] <= 1;    @(posedge xmi.sig_clock iff xmi.sig_grant[master_id] === 1);    xmi.sig_request[master_id] <= 0;  endtask : arbitrate_for_bus  // drive_address_phase  virtual protected task drive_address_phase (xbus_transfer trans);    xmi.sig_addr <= trans.addr;    drive_size(trans.size);    drive_read_write(trans.read_write);    @(posedge xmi.sig_clock);    xmi.sig_addr <= 32'bz;    xmi.sig_size <= 2'bz;    xmi.sig_read <= 1'bz;    xmi.sig_write <= 1'bz;    endtask : drive_address_phase  // drive_data_phase  virtual protected task drive_data_phase (xbus_transfer trans);    bit err;    for(int i = 0; i <= trans.size - 1; i ++) begin      if (i == (trans.size - 1))        xmi.sig_bip <= 0;      else        xmi.sig_bip <= 1;      case (trans.read_write)        READ    : read_byte(trans.data[i], err);        WRITE   : write_byte(trans.data[i], err);      endcase    end //for loop    xmi.sig_data_out <= 8'bz;    xmi.sig_bip <= 1'bz;  endtask : drive_data_phase  // read_byte  virtual protected task read_byte (output bit [7:0] data, output bit error);    @(posedge xmi.sig_clock iff xmi.sig_wait === 0);    data = xmi.sig_data;  endtask : read_byte  // write_byte  virtual protected task write_byte (bit[7:0] data, output bit error);    xmi.rw <= 1'b1;    xmi.sig_data_out <= data;    @(posedge xmi.sig_clock iff xmi.sig_wait === 0);    xmi.rw <= 'h0;  endtask : write_byte  // drive_size  virtual protected task drive_size (int size);    case (size)      1: xmi.sig_size <=  2'b00;      2: xmi.sig_size <=  2'b01;      4: xmi.sig_size <=  2'b10;      8: xmi.sig_size <=  2'b11;    endcase  endtask : drive_size  // drive_read_write              virtual protected task drive_read_write(xbus_read_write_enum rw);    case (rw)      NOP   : begin xmi.sig_read <= 0; xmi.sig_write <= 0; end      READ  : begin xmi.sig_read <= 1; xmi.sig_write <= 0; end      WRITE : begin xmi.sig_read <= 0; xmi.sig_write <= 1; end    endcase  endtask : drive_read_writeendclass : xbus_master_driver`endif // XBUS_MASTER_DRIVER_SV

⌨️ 快捷键说明

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