Code Browser Pages:
Files in
vmm_eth.tar



call_back.sv
cfg_intf.sv
cfg_xtor.sv
chan.sv
cov.sv
env.sv
file_list
host_driver.sv
host_intf.sv
host_xtor_rx.sv
Current file: host_xtor.sv
phy_driver.sv
phy_intf.sv
phy_xtor_rx.sv
phy_xtor.sv
pkt_generator_rx.sv
pkt_generator.sv
pkt.sv
pro.sv
run
rx_pkt.sv
sb.sv
tb_top.v
timescale.v
top.sv
verilog_top.v



`include "vmm.sv"

`ifndef HOST_XTOR_CLASS
`define HOST_XTOR_CLASS


class host_xtor_tx extends vmm_xactor;

 integer EXECUTING;
 host_driver drvr;
 packet_channel chan_gen2xtor;
 packet_channel chan_hst2sb;
 extern function new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb );
 extern task drive_packet(packet pkt);
 extern task main();

endclass

function host_xtor_tx::new(string name,host_driver drvr,packet_channel chan_gen2xtor,packet_channel chan_hst2sb);
   super.new("HOST_TX",name);
   if(drvr == null)
    `vmm_fatal(log,$psprintf(" null object drvr "));

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

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

endfunction


task host_xtor_tx::drive_packet(packet pkt);
  integer length,i,last_word,loop_var;
  bit[31:0] last_wd;
  logic [7:0] bytes[];

  length = pkt.byte_pack(bytes);
  `vmm_note(this.log,$psprintf("Sending packet of length 0",length));
  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) begin
  // Wait if Tx_mac_wa is low. 
  while(drvr.read_Tx_mac_wa() === 0)
    begin
      drvr.drive_Tx_mac_wr(0);
      drvr.posedge_clk() ;
    end

  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//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} ;
  endcase

  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);
endtask

task host_xtor_tx::main();
  packet p;
  fork
   super.main();
  join_none

  fork
   forever
     begin
       this.wait_if_stopped_or_empty(chan_gen2xtor);
       this.chan_gen2xtor.activate(p);
       this.chan_gen2xtor.start();
       this.notify.indicate(this.EXECUTING,p);
       `vmm_trace(this.log, "Starting transaction...");
       `vmm_debug(this.log, p.psdisplay());
       `vmm_callback(data_callback,pre_call(p));
       this.drive_packet(p);
       `vmm_callback(data_callback,post_call(p));
       this.chan_hst2sb.sneak(p);
       this.notify.reset(this.EXECUTING);
       this.chan_gen2xtor.complete();
       `vmm_trace(this.log, "Completed transaction...");
       `vmm_debug(this.log, p.psdisplay());
       this.chan_gen2xtor.remove();
       repeat(20) drvr.posedge_clk() ;
     end
  join_none
endtask


`endif