Code Browser Pages:
Files in
vmm1.2_example.tar



dummy_rtl.v
ReadMe.txt
vmm_cfg.sv
vmm_cov.sv
Current file: vmm_drv.sv
vmm_env.sv
vmm_gen.sv
vmm_interface.sv
vmm_packet.sv
vmm_rcv.sv
vmm_sbd.sv
vmm_scn.sv
vmm_top.sv



///////////////////////////////////////
///////////////////////////////////////
////                               ////
////        VMM 1.2 example        ////
////                               ////
////     For more vmm examples     ////
////     visit www.testbench.in    ////
////                               ////
///////////////////////////////////////
///////////////////////////////////////


//-----------------------------------------------------------------------------
// Dummy rtl driver-xactor Class
//-----------------------------------------------------------------------------

// driver callback class
typedef class my_driver_callbacks;
// Scoreboard
typedef class my_sb;

class my_driver extends vmm_xactor;

  // dummy rtl transacion channel 
  packet_channel get_data_chan;

  // dummy rtl interface
  virtual dut_if.driver drv_if;

  //-----------------------------------------------------------------------------
  // new() - Constructor
  //-----------------------------------------------------------------------------

  function new(string                inst,
               int unsigned          stream_id = -1,
               virtual dut_if.driver drv_if,
               packet_channel        in_chan     = null
              );

    super.new("MY_DRIVER", inst, stream_id);
    this.drv_if = drv_if;
    this.get_data_chan = in_chan;
  endfunction : new

  //-----------------------------------------------------------------------------
  // reset_xactor ()
  //-----------------------------------------------------------------------------

  virtual function void reset_xactor(reset_e rst_typ = SOFT_RST);
    super.reset_xactor(rst_typ);
    `vmm_note(log,"reset_xactor() - Inside ");
    this.drv_if.address <= 0;
    this.drv_if.o_data  <= 0;
    this.drv_if.rdwr    <= packet::READ;
    this.drv_if.en      <= packet::nEN;
    this.get_data_chan.flush();
    `vmm_note(log,"reset_xactor() - Exiting ");
  endfunction : reset_xactor

  //-----------------------------------------------------------------------------
  // main ()
  //-----------------------------------------------------------------------------

  protected virtual task main();
    fork
      super.main();
      get_data();
    join_none
  endtask : main

  //-----------------------------------------------------------------------------
  // get_data ()
  //-----------------------------------------------------------------------------

  virtual task get_data();
    while(1) begin
      packet p1;
      this.wait_if_stopped_or_empty(this.get_data_chan);
      this.get_data_chan.get(p1);
      `vmm_note(log,"get_data() - Packet took from the channel ");
      `vmm_callback(my_driver_callbacks, pre_packet_tx(this, p1));
      drive_data(p1);
      `vmm_callback(my_driver_callbacks, post_packet_tx(this, p1));
    end
  endtask : get_data

  //-----------------------------------------------------------------------------
  // drive_data ()
  //-----------------------------------------------------------------------------

  virtual task drive_data(ref packet p1);
    `vmm_note(log,"drive_data() - Inside ");
    @(posedge this.drv_if.clk);
    this.drv_if.address <= p1.address;
    this.drv_if.o_data  <= p1.data   ;
    drv_if.rdwr         <= (p1.rdwr == packet::WRITE) ? 1'b1 : 1'b0;
    this.drv_if.en      <= (p1.en == packet::EN) ? 1'b1 : 1'b0 ;
    if(p1.rdwr == packet::WRITE)
      $display ("[%0t] :: DRIVER   :: ENABLE =  TYPE =  - ADDRESS = %0h - DATA = %0h",$realtime, p1.en.name, p1.rdwr.name, p1.address, p1.data);
    else
      $display ("[%0t] :: DRIVER   :: ENABLE =  TYPE =  - ADDRESS = %0h ",$realtime, p1.en.name, p1.rdwr.name, p1.address);
    `vmm_note(log,"drive_data() - Exiting ");
  endtask : drive_data

endclass : my_driver

//-----------------------------------------------------------------------------
// Dummy rtl driver-xactor callback Class
//-----------------------------------------------------------------------------

class my_driver_callbacks extends vmm_xactor_callbacks;
  my_sb scbd;
  static vmm_log log = new("DRIVER_CALLBACKS", "Class");

  function new(my_sb scbd);
    this.scbd = scbd;
  endfunction : new

  // Callbacks before a transaction is started
  virtual task pre_packet_tx(my_driver drv, packet p);
    // Empty 
  endtask : pre_packet_tx

  // Callback after a transaction is completed
  virtual task post_packet_tx(my_driver drv, packet p);
    int stream = 1;
    `vmm_note(log,"post_packet_tx() - Inside ");
    p.data = (p.rdwr == 1'b1) ? p.data : 8'h0 ;
    scbd.insert(p, vmm_sb_ds::INPUT, stream);
    `vmm_note(log,"post_packet_tx() - Exiting ");
  endtask : post_packet_tx
endclass : my_driver_callbacks

//-----------------------------------------------------------------------------
// end of file 
//-----------------------------------------------------------------------------