OpenCores
URL https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk

Subversion Repositories uart2bus_testbench

[/] [uart2bus_testbench/] [trunk/] [tb/] [agent/] [driver/] [uart_driver.svh] - Diff between revs 8 and 14

Only display areas with differences | Details | Blame | View Log

Rev 8 Rev 14
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
//
//
//                                     UART2BUS VERIFICATION
//                                     UART2BUS VERIFICATION
//
//
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// CREATOR    : HANY SALAH
// CREATOR    : HANY SALAH
// PROJECT    : UART2BUS UVM TEST BENCH
// PROJECT    : UART2BUS UVM TEST BENCH
// UNIT       : DRIVER
// UNIT       : DRIVER
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// TITLE      : UART DRIVER
// TITLE      : UART DRIVER
// DESCRIPTION: THIS DRIVER IS RESPONSIBLE FOR SETTING BFMS CONFIGURATIONS. ALSO DRIVING STIMULUS
// DESCRIPTION: THIS DRIVER IS RESPONSIBLE FOR SETTING BFMS CONFIGURATIONS. ALSO DRIVING STIMULUS
//              TO THE BFMS AND SENDING TRANSACTIONS TO SCOREBOARD.
//              TO THE BFMS AND SENDING TRANSACTIONS TO SCOREBOARD.
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// LOG DETAILS
// LOG DETAILS
//-------------
//-------------
// VERSION      NAME        DATE        DESCRIPTION
// VERSION      NAME        DATE        DESCRIPTION
//    1       HANY SALAH    02012016    FILE CREATION
//    1       HANY SALAH    02012016    FILE CREATION
//    2       HANY SALAH    07012016    ADD INITIALIZE BFM METHOD
//    2       HANY SALAH    07012016    ADD INITIALIZE BFM METHOD
//    3       HANY SALAH    17022016    IMPROVE BLOCK DESCRIPTION AND ADD COMMENTS
//    3       HANY SALAH    17022016    IMPROVE BLOCK DESCRIPTION AND ADD COMMENTS
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR OPENCORES MEMBERS
// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR OPENCORES MEMBERS
// ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE CREATOR'S PERMISSION
// ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE CREATOR'S PERMISSION
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
class uart_driver extends uvm_driver #(uart_transaction);
class uart_driver extends uvm_driver #(uart_transaction);
  // Two Transaction Instances that are used to bring and clone the stimulus
  // Two Transaction Instances that are used to bring and clone the stimulus
  uart_transaction      trans,_trans;
  uart_transaction      trans,_trans;
  // Instance from Global UART Configuration
  // Instance from Global UART Configuration
  uart_config           _config;
  uart_config           _config;
  // UART Interafce instance
  // UART Interafce instance
  virtual uart_interface  uart_inf;
  virtual uart_interface  uart_inf;
  // RF Interface instance
  // RF Interface instance
  virtual rf_interface rf_inf;
  virtual rf_interface rf_inf;
  // Arbiter Interface Instance
  // Arbiter Interface Instance
  virtual uart_arbiter  arb_inf;
  virtual uart_arbiter  arb_inf;
  // Analysis Port to both scoreboard and driver
  // Analysis Port to both scoreboard and driver
  uvm_analysis_port #(uart_transaction)   drv_scbd_cov;
  uvm_analysis_port #(uart_transaction)   drv_scbd_cov;
  `uvm_component_utils(uart_driver)
  `uvm_component_utils(uart_driver)
  function new (string name , uvm_component parent);
  function new (string name , uvm_component parent);
    super.new(name,parent);
    super.new(name,parent);
  endfunction: new
  endfunction: new
  // UVM Build Phase Declaration that includes locating instances and get interfaces handler from
  // UVM Build Phase Declaration that includes locating instances and get interfaces handler from
  // the configuration database
  // the configuration database
  extern function void build_phase (uvm_phase phase);
  extern function void build_phase (uvm_phase phase);
  // Both BFMs configurations setting and BFMs assignment are carried out through this UVM phase.
  // Both BFMs configurations setting and BFMs assignment are carried out through this UVM phase.
  extern function void end_of_elaboration_phase (uvm_phase phase);
  extern function void end_of_elaboration_phase (uvm_phase phase);
  extern task run_phase (uvm_phase phase);
  extern task run_phase (uvm_phase phase);
  // Actual drive data routine
  // Actual drive data routine
  extern task drive_data ();
  extern task drive_data ();
  // initialize bfms
  // initialize bfms
  extern function void initialize_bfms (act_edge  _edge,
  extern function void initialize_bfms (act_edge  _edge,
                                        start_bit _bit,
                                        start_bit _bit,
                                        int enable,
                                        int enable,
                                        int num_stop_bits,
                                        int num_stop_bits,
                                        int num_of_bits,
                                        int num_of_bits,
                                        data_mode _datamode,
                                        data_mode _datamode,
                                        parity_mode _paritymode,
                                        parity_mode _paritymode,
                                        time _resp);
                                        time _resp);
endclass:uart_driver
endclass:uart_driver
function void uart_driver::build_phase (uvm_phase phase);
function void uart_driver::build_phase (uvm_phase phase);
  super.build_phase(phase);
  super.build_phase(phase);
  trans   = uart_transaction::type_id::create("trans");
  trans   = uart_transaction::type_id::create("trans");
  _trans  = uart_transaction::type_id::create("_trans");
  _trans  = uart_transaction::type_id::create("_trans");
  _config = uart_config::type_id::create("_config");
  _config = uart_config::type_id::create("_config");
  drv_scbd_cov = new("drv_scbd_cov",this);
  drv_scbd_cov = new("drv_scbd_cov",this);
endfunction:build_phase
endfunction:build_phase
function void uart_driver::end_of_elaboration_phase (uvm_phase phase);
function void uart_driver::end_of_elaboration_phase (uvm_phase phase);
  if(!uvm_config_db#(uart_config)::get(this, "", "UART_CONFIGURATION", _config))
  if(!uvm_config_db#(uart_config)::get(this, "", "UART_CONFIGURATION", _config))
    `uvm_fatal("NOCONFIGURATION",{"configuration instance must be set for: ",get_full_name(),"._config"});
    `uvm_fatal("NOCONFIGURATION",{"configuration instance must be set for: ",get_full_name(),"._config"});
  if(!uvm_config_db#(virtual uart_interface)::get(this, "", "uart_inf", _config.uart_inf))
  if(!uvm_config_db#(virtual uart_interface)::get(this, "", "uart_inf", _config.uart_inf))
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".uart_inf"});
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".uart_inf"});
    uart_inf=_config.uart_inf;
    uart_inf=_config.uart_inf;
  if(!uvm_config_db#(virtual rf_interface)::get(this, "", "rf_inf", _config.rf_inf))
  if(!uvm_config_db#(virtual rf_interface)::get(this, "", "rf_inf", _config.rf_inf))
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".rf_inf"});
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".rf_inf"});
    rf_inf=_config.rf_inf;
    rf_inf=_config.rf_inf;
  if(!uvm_config_db#(virtual uart_arbiter)::get(this,"","arb_inf",_config.arb_inf))
  if(!uvm_config_db#(virtual uart_arbiter)::get(this,"","arb_inf",_config.arb_inf))
      `uvm_fatal("NOVIF",{"virtual interface must be set for:",get_full_name(),".arb_inf"})
      `uvm_fatal("NOVIF",{"virtual interface must be set for:",get_full_name(),".arb_inf"})
    arb_inf=_config.arb_inf;
    arb_inf=_config.arb_inf;
  initialize_bfms(_config._edge,
  initialize_bfms(_config._edge,
              _config._start,
              _config._start,
              _config.use_false_data,
              _config.use_false_data,
              _config.num_stop_bits,
              _config.num_stop_bits,
              _config.num_of_bits,
              _config.num_of_bits,
              _config._datamode,
              _config._datamode,
              _config._paritymode,
              _config._paritymode,
              _config.response_time);
              _config.response_time);
endfunction:end_of_elaboration_phase
endfunction:end_of_elaboration_phase
function void uart_driver::initialize_bfms (act_edge  _edge,
function void uart_driver::initialize_bfms (act_edge  _edge,
                                            start_bit _bit,
                                            start_bit _bit,
                                            int  enable,
                                            int  enable,
                                            int num_stop_bits,
                                            int num_stop_bits,
                                            int num_of_bits,
                                            int num_of_bits,
                                            data_mode _datamode,
                                            data_mode _datamode,
                                            parity_mode _paritymode,
                                            parity_mode _paritymode,
                                            time      _resp);
                                            time      _resp);
  uart_inf.set_configuration (_edge,_bit,num_stop_bits,num_of_bits,_datamode,_paritymode,_resp,enable);
  uart_inf.set_configuration (_edge,_bit,num_stop_bits,num_of_bits,_datamode,_paritymode,_resp,enable);
endfunction:initialize_bfms
endfunction:initialize_bfms
task uart_driver::run_phase (uvm_phase phase);
task uart_driver::run_phase (uvm_phase phase);
  forever
  forever
    begin
    begin
    seq_item_port.get_next_item(_trans);
    seq_item_port.get_next_item(_trans);
    $cast(trans,_trans.clone());
    $cast(trans,_trans.clone());
    drv_scbd_cov.write(trans);
    drv_scbd_cov.write(trans);
    drive_data();
    drive_data();
    seq_item_port.item_done();
    seq_item_port.item_done();
    end
    end
endtask:run_phase
endtask:run_phase
task uart_driver::drive_data();
task uart_driver::drive_data();
  uart_inf.wait_idle_time(trans.time_before*trans.scale);
  uart_inf.wait_idle_time(trans.time_before*trans.scale);
  uart_inf.set_event();
  uart_inf.set_event();
  if (trans._mode == text || trans._mode == wrong_mode_text)
  if (trans._mode == text || trans._mode == wrong_mode_text)
    begin
    begin
    case(trans._command)
    case(trans._command)
      read:
      read:
        begin
        begin
        /*fork
 
        begin
 
          if (trans._arbit == accept)
 
            begin
 
            arb_inf.accept_req();
 
            end
 
          else
 
            begin
 
            arb_inf.declain_req();
 
            end
 
        end
 
        join_none*/
 
        rf_inf.fill_byte (trans.address,
        rf_inf.fill_byte (trans.address,
                          trans._data[0]);
                          trans._data[0]);
        uart_inf.read_text_mode(trans._mode,
        uart_inf.read_text_mode(trans._mode,
                                trans.wrong_prefix,
                                trans.wrong_prefix,
                                trans._chartype,
                                trans._chartype,
                                trans._spacetype1,
                                trans._spacetype1,
                                trans.space_wrong1,
                                trans.space_wrong1,
                                trans._eoltype,
                                trans._eoltype,
                                trans.eol_wrong,
                                trans.eol_wrong,
                                trans.address,
                                trans.address,
                                trans.false_data[0],
                                trans.false_data[0],
                                trans.false_data_en);
                                trans.false_data_en);
        end
        end
      write:
      write:
        begin
        begin
        /*fork
 
        begin
 
          if (trans._arbit == accept)
 
            begin
 
            arb_inf.accept_req();
 
            end
 
          else
 
            begin
 
            arb_inf.declain_req();
 
            end
 
        end
 
        join_none*/
 
        uart_inf.write_text_mode(trans._mode,
        uart_inf.write_text_mode(trans._mode,
                                 trans.wrong_prefix,
                                 trans.wrong_prefix,
                                 trans._chartype,
                                 trans._chartype,
                                 trans._spacetype1,
                                 trans._spacetype1,
                                 trans.space_wrong1,
                                 trans.space_wrong1,
                                 trans._spacetype2,
                                 trans._spacetype2,
                                 trans.space_wrong2,
                                 trans.space_wrong2,
                                 trans._eoltype,
                                 trans._eoltype,
                                 trans.eol_wrong,
                                 trans.eol_wrong,
                                 trans.address,
                                 trans.address,
                                 trans._data[0]);
                                 trans._data[0]);
        end
        end
      nop:
      nop:
        begin
        begin
        `uvm_fatal("UNEXPECTED VALUE","NOP command value shouldn't be valued in text mode")
        `uvm_fatal("TB ISSUE","NOP command value shouldn't be valued in text mode")
        end
        end
      default:
      default:
        begin
        begin
        `uvm_fatal("wrong output", "wrong_mode")
        `uvm_fatal("TB ISSUE", "wrong_mode")
        end
        end
    endcase
    endcase
    end
    end
  else if (trans._mode==binary || trans._mode==wrong_mode_bin)
  else if (trans._mode==binary || trans._mode==wrong_mode_bin)
    begin
    begin
    if (trans._command == read || trans._command == invalid_read)
    if (trans._command == read || trans._command == invalid_read)
      begin
      begin
      rf_inf.fill_block(trans.address,
      rf_inf.fill_block(trans.address,
                        trans._data,
                        trans._data,
                        trans.length_data);
                        trans.length_data);
      uart_inf.read_binary_mode(trans._mode,
      uart_inf.read_binary_mode(trans._mode,
                                trans.wrong_prefix,
                                trans.wrong_prefix,
                                trans._command,
                                trans._command,
                                trans._reqack,
                                trans._reqack,
                                trans._reqinc,
                                trans._reqinc,
                                trans.length_data,
                                trans.length_data,
                                trans.address,
                                trans.address,
                                trans._data,
                                trans._data,
                                trans.false_data,
                                trans.false_data,
                                trans.false_data_en);
                                trans.false_data_en);
      end
      end
    else if (trans._command == write || trans._command == invalid_write)
    else if (trans._command == write || trans._command == invalid_write)
      begin
      begin
      uart_inf.write_binary_mode(trans._mode,
      uart_inf.write_binary_mode(trans._mode,
                                 trans.wrong_prefix,
                                 trans.wrong_prefix,
                                 trans._command,
                                 trans._command,
                                 trans._reqack,
                                 trans._reqack,
                                 trans._reqinc,
                                 trans._reqinc,
                                 trans.length_data,
                                 trans.length_data,
                                 trans.address,
                                 trans.address,
                                 trans._data);
                                 trans._data);
      end
      end
    else
    else
      begin
      begin
      uart_inf.nop_command(trans._mode,
      uart_inf.nop_command(trans._mode,
                           trans.wrong_prefix,
                           trans.wrong_prefix,
                           trans._reqack,
                           trans._reqack,
                           trans._reqinc);
                           trans._reqinc);
      end
      end
    end
    end
  uart_inf.wait_idle_time(trans.time_after*trans.scale);
  uart_inf.wait_idle_time(trans.time_after*trans.scale);
 
endtask:drive_data
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.