Code Browser Pages:
Files in
rvm_eth.tar



call_back.vr
cfg_intf.vr
cfg_xtor.vr
chan.vr
cov.vr
defines.vr
env.vr
host_driver.vr
host_intf.vr
host_xtor_rx.vr
Current file: host_xtor.vr
phy_driver.vr
phy_intf.vr
phy_xtor_rx.vr
phy_xtor.vr
pkt.vr
pro.vr
run
rx_pkt.vr
sb.vr
timescale.v
top.v



#include <rvm_std_lib.vrh>

#ifndef HOST_XTOR_CLASS
#define HOST_XTOR_CLASS


class host_xtor_tx extends rvm_xactor{

  integer EXECUTING;
  host_driver drvr;
  packet_channel chan_gen2xtor;
  packet_channel chan_hst2sb;
  task new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb );
  task drive_packet(packet pkt);
  task main_t();
}

task host_xtor_tx::new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb){
  super.new("HOST_RX",name);
  if(drvr == null)
  { rvm_note(log,psprintf(" null object drvr ")); }

  this.drvr = drvr;
  this.chan_gen2xtor = chan_gen2xtor;
  this.chan_hst2sb   = chan_hst2sb  ;

  this.EXECUTING = this.notify.configure();

}


task host_xtor_tx::drive_packet(packet pkt){
  integer length,i,last_word,loop_var;
  bit[31:0] last_wd;
  bit [7:0] bytes[*];
  rvm_note(this.log,psprintf("Sending packet "));

  void = pkt.byte_pack(bytes);
  length = bytes.size();
  last_word = length % 4 ?  length % 4 : 4;
  loop_var = length - last_word ;

  drvr.posedge_clk() ;

  for(i = 0;i < loop_var - 1;i = i + 4) {
  // Wait if Tx_mac_wa is low. 
   while(drvr.read_Tx_mac_wa() === 0)
   { drvr.drive_Tx_mac_wr(0);
     drvr.posedge_clk() ;
    }
  if(i == 0)
  // Assert Sop signal.
    drvr.drive_Tx_mac_sop(1);
  else
    drvr.drive_Tx_mac_sop(0);

  drvr.drive_Tx_mac_eop(0);
  drvr.drive_Tx_mac_wr(1);
  drvr.drive_Tx_mac_BE(2'b11);
  drvr.drive_Tx_mac_data({bytes[i],bytes[i+1],bytes[i+2],bytes[i+3]});
  drvr.posedge_clk() ;


  }//end of for

  drvr.drive_Tx_mac_sop(0);
  drvr.drive_Tx_mac_eop(1);
  drvr.drive_Tx_mac_wr(1);
  drvr.drive_Tx_mac_BE(last_word);
  last_wd = 32'h0;

  case(last_word) {
  4:last_wd = { bytes[length -4 ],bytes[length - 3],bytes[length  -2],bytes[length -1]} ;
  3:last_wd = { bytes[length - 3],bytes[length  -2],bytes[length -1],8'h0} ;
  2:last_wd = { bytes[length  -2],bytes[length -1],16'h0} ;
  1:last_wd = { bytes[length -1],24'h0} ;
   }

  drvr.drive_Tx_mac_data(last_wd);

  drvr.posedge_clk() ;
  drvr.drive_Tx_mac_sop(0);
  drvr.drive_Tx_mac_eop(0);
  drvr.drive_Tx_mac_wr(0);
  drvr.drive_Tx_mac_BE(0);
  drvr.drive_Tx_mac_data(0);
} //end of task

task host_xtor_tx::main_t(){
  packet p;
  fork
   super.main_t();
  join none
  fork
    while(1) {
      this.wait_if_stopped_or_empty_t(chan_gen2xtor);
      p = this.chan_gen2xtor.activate_t();
      void = this.chan_gen2xtor.start();
      this.notify.indicate(this.EXECUTING,p);
      rvm_trace(this.log, "Starting transaction...");
      rvm_debug(this.log, p.psdisplay());
      rvm_OO_callback(data_callback,pre_cb(p));
      this.drive_packet(p);
      rvm_OO_callback(data_callback,post_cb(p));
      this.chan_hst2sb.put_t(p);
      this.notify.reset(this.EXECUTING);
      void = this.chan_gen2xtor.complete();
      rvm_trace(this.log, "Completed transaction...");
      rvm_debug(this.log, p.psdisplay());
      void = this.chan_gen2xtor.remove();
      repeat(20) drvr.posedge_clk() ;
    }
  join none
}


#endif