Code Browser Pages:
Files in
vmm_switch_6.tar



Current file: Driver.sv
Environment.sv
filelist
Globals.sv
interface.sv
Packet.sv
README.txt
rtl.sv
testcase.sv
top.sv



////////////////////////////////////////////////
////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s////
////s           www.testbench.in           s////
////s                                      s////
////s             VMM Tutorial             s////
////s           gopi@testbench.in          s////
////s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~s////
////////////////////////////////////////////////

`ifndef GUARD_DRIVER
`define GUARD_DRIVER


class Driver_callbacks extends vmm_xactor_callbacks;

   // Called before a transaction is executed
   virtual task pre_trans(Packet tr);
   endtask: pre_trans

   // Called after a transaction has been executed
   virtual task post_trans(Packet tr);
   endtask: post_trans

endclass:Driver_callbacks



class Driver extends vmm_xactor;

   virtual input_interface.IP  input_intf;
   Packet_channel              gen2drv_chan;
   Packet_channel              drv2sb_chan;


function new(string inst,
             int stream_id = -1,
             virtual input_interface.IP  input_intf_new,
             Packet_channel   gen2drv_chan = null,
             Packet_channel   drv2sb_chan = null);

      super.new("driver",inst,stream_id);

      this.input_intf = input_intf_new;

      if(gen2drv_chan == null)
            `vmm_fatal(log,"gen2drv_channel is null");
      else
            this.gen2drv_chan = gen2drv_chan;

      if(drv2sb_chan == null)
            `vmm_fatal(log,"drvr2sb_channel is null");
      else
            this.drv2sb_chan = drv2sb_chan;

      `vmm_note(log,"Driver created ");
endfunction

task drive(Packet pkt);
    logic [7:0] pack[];
    int pkt_len;

    pkt_len = pkt.byte_pack(pack,0,0);
    @(posedge input_intf.clock);

    for (int i=0;i< pkt_len - 1;i++)
    begin
        @(posedge input_intf.clock);
        input_intf.cb.data_status <= 1 ;
        input_intf.cb.data_in <= pack[i];
    end

    @(input_intf.clock);
    input_intf.cb.data_status <= 0 ;
    input_intf.cb.data_in <= pack[pkt_len -1];
    @(input_intf.clock);
endtask


task main();
    super.main();
    `vmm_note(this.log," started main task ");

     forever begin
         Packet pkt;

         wait_if_stopped_or_empty(this.gen2drv_chan);
         this.gen2drv_chan.get(pkt);

         `vmm_trace(this.log, "Starting transaction...");
         `vmm_debug(this.log, pkt.psdisplay("   "));

         `vmm_callback(Driver_callbacks,pre_trans(pkt));

         drive(pkt);

         `vmm_callback(Driver_callbacks,post_trans(pkt));

         `vmm_trace(this.log, "Completed transaction...");
         `vmm_debug(this.log, pkt.psdisplay("   "));
         @(posedge input_intf.clock);
         this.drv2sb_chan.put(pkt);
     end
endtask

endclass
`endif