Code Browser Pages:
Files in
vmm_eth.tar



call_back.sv
cfg_intf.sv
cfg_xtor.sv
chan.sv
cov.sv
Current file: env.sv
file_list
host_driver.sv
host_intf.sv
host_xtor_rx.sv
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



// by gopi@testbench.in
`include "vmm.sv"
`ifndef ENV_CLASS
`define ENV_CLASS

class env extends vmm_env ;
  integer  time_out = 100000;
  integer        seed;
  integer rx_num_pkts = 20;
  integer tx_num_pkts = 20;

  virtual host_intf h_if;
  virtual phy_intf  p_if;
  virtual cfg_intf  c_if;

  packet_channel           chan_gen_tx;
  packet_channel           chan_hst2sb_tx;
  packet_channel           chan_phy2sb_tx;
  rx_packet_channel        chan_gen_rx;
  packet_channel        chan_hst2sb_rx;
  packet_channel        chan_phy2sb_rx;

  host_driver    h_drvr;
  phy_driver     p_drvr;
  cfg_driver     c_drvr;

  host_xtor_tx   h_xtor_tx;
  phy_xtor_tx    p_xtor_tx;
  host_xtor_rx   h_xtor_rx;
  phy_xtor_rx    p_xtor_rx;
  cfg_xtor       c_xtor;

  packet         tx_pkt;
  rx_packet      rx_pkt;

  sb             sb_tx;
  sb             sb_rx;

  packet_atomic_gen gen_tx;
  rx_packet_atomic_gen gen_rx;

  dbg_data_callback dbg_callback;

  cov rx_cov;
  cov tx_cov;

  extern function new(virtual host_intf h_if,virtual phy_intf  p_if,virtual cfg_intf  c_if);
  extern virtual function void gen_cfg();
  extern virtual function void build();
  extern virtual task reset_dut();
  extern virtual task cfg_dut();
  extern virtual task start();
  extern virtual task wait_for_end();
  extern virtual task stop();
  extern virtual task cleanup();
  extern virtual task report();
  // Non Vmm methods
  extern virtual task Global_timeout();
  extern virtual task Set_timeout(integer time_out);
  extern virtual task Heart_beat();
  extern virtual task set_rx_num_pkts (integer num);
  extern virtual task set_tx_num_pkts (integer num);

endclass

function env::new(virtual host_intf h_if,virtual phy_intf  p_if,virtual cfg_intf  c_if);
   super.new("Environment");
   this.log = new("ENV_LOG","0");
   `vmm_note(this.log," ENV CREATED ");
   this.h_if = h_if;
   this.p_if = p_if;
   this.c_if = c_if;
   this.log.stop_after_n_errors(1);
endfunction

function void env::gen_cfg();
   super.gen_cfg();
   `vmm_note(this.log," Starting... Gen_cfg ");

   if ($value$plusargs("use_seed=0", seed))
   begin
    `vmm_note(this.log,$psprintf("Using User specified seed 0 ",seed));
   end
   else
   begin
    seed = 1;
    `vmm_note(this.log,$psprintf("Using Default seed 0 ",seed));
   end
   $srandom(seed);
endfunction

function void env::build();
  super.build();
  `vmm_note(this.log," Starting... build ");

  gen_tx = new("GEN","TX_GEN");
  gen_rx = new("GEN","RX_GEN");

  chan_gen_tx      = new("CHAN_gen_tx","CHAN",1);
  chan_hst2sb_tx   = new("CHAN_hst2sb_tx","CHAN",100);
  chan_phy2sb_tx   = new("CHAN_phy2sb_tx","CHAN",100);
  chan_gen_rx      = new("CHAN_gen_rx","CHAN",1);
  chan_hst2sb_rx   = new("CHAN_hst2sb_rx","CHAN",100);
  chan_phy2sb_rx   = new("CHAN_phy2sb_rx","CHAN",100);

  tx_pkt = new();
  rx_pkt = new();

  h_drvr = new("Host_driver",h_if);
  p_drvr = new("PHY_driver",p_if);
  c_drvr = new("CFG_driver",c_if);

  c_xtor = new("Cfg_xtor",c_drvr);
  h_xtor_tx = new("HOST_XTOR_TX",h_drvr,chan_gen_tx,chan_hst2sb_tx);
  h_xtor_rx = new("HOST_XTOR_RX",h_drvr,chan_hst2sb_rx);
  p_xtor_tx = new("PHY_XTOR_TX",p_drvr,chan_phy2sb_tx);
  p_xtor_rx = new("PHY_XTOR_RX",p_drvr,chan_gen_rx,chan_phy2sb_rx);

  gen_tx.out_chan = chan_gen_tx;
  gen_rx.out_chan = chan_gen_rx;

  rx_cov = new();
  tx_cov = new();

  sb_tx = new("SB_TX",chan_hst2sb_tx,chan_phy2sb_tx,tx_cov);
  sb_rx = new("SB_RX",chan_phy2sb_rx,chan_hst2sb_rx,rx_cov);

  dbg_callback = new();

  h_xtor_tx.append_callback(dbg_callback);
  p_xtor_rx.append_callback(dbg_callback);

endfunction

task env::reset_dut();
  super.reset_dut();
  `vmm_note(this.log," Starting... reset_dut ");

  h_drvr.posedge_clk() ;
  h_drvr.drive_Tx_mac_sop(0);
  h_drvr.drive_Tx_mac_eop(0);
  h_drvr.drive_Tx_mac_wr(0);
  h_drvr.drive_Tx_mac_BE(0);
  h_drvr.drive_Tx_mac_data(0);
  h_drvr.drive_Reset(1);
  p_drvr.drive_Rx_dv(0);
  p_drvr.drive_Rxd(0);
  p_drvr.drive_Rx_er(0);
  p_drvr.drive_Crs(0);
  p_drvr.drive_Col(0);

  repeat(20) h_drvr.posedge_clk();

  h_drvr.drive_Reset(0);
  `vmm_note(this.log," Ending...  reset_dut ");

endtask

task env::cfg_dut();
integer i;
  super.cfg_dut();
  `vmm_note(this.log," Starting... cfg_dut ");
  `vmm_note(this.log," Ending...  cfg_dut ");
   gen_tx.stop_after_n_insts = tx_num_pkts;
   gen_rx.stop_after_n_insts = rx_num_pkts;
endtask


task env::start();
  super.start();
  `vmm_note(this.log," Starting... start ");
  this.Heart_beat();
  gen_tx.start_xactor();
  gen_rx.start_xactor();
  sb_tx.start_xactor();
  sb_rx.start_xactor();
  h_xtor_tx.start_xactor();
  h_xtor_rx.start_xactor();
  p_xtor_tx.start_xactor();
  p_xtor_rx.start_xactor();
endtask

task env::wait_for_end();
   super.wait_for_end();
   `vmm_note(this.log," Starting... wait_for_end ");
   repeat(30)@(posedge host_intf.clk);

  fork//watchdog
  begin
    Global_timeout();
   `vmm_note(this.log," Watchdog timeout occured ");
  end
  begin
  repeat(20000) @(posedge host_intf.clk);
  while((tx_num_pkts != sb_tx.rcv_num_pkts()) || (rx_num_pkts != sb_rx.rcv_num_pkts()))
  @(posedge host_intf.clk);
   `vmm_note(this.log," DONE:: total number of sent pkts are receved ");

  end
  join_any
   `vmm_note(this.log," Ending ... wait_for_end ");

endtask

task env::stop() ;
   super.stop();
   `vmm_note(this.log," Starting... stop ");

   gen_tx.stop_xactor();
   gen_rx.stop_xactor();
   sb_tx.stop_xactor();
   sb_rx.stop_xactor();
   h_xtor_tx.stop_xactor();
   h_xtor_rx.stop_xactor();
   p_xtor_tx.stop_xactor();
   p_xtor_rx.stop_xactor();

   `vmm_note(this.log," Ending ... stop ");

endtask



task env::cleanup() ;
   super.cleanup();
   `vmm_note(this.log," Starting... cleanup ");
endtask

task env::report() ;
   `vmm_note(this.log," Starting... report ");
   super.report();
   sb_tx.final_report();
   sb_rx.final_report();
   $display("\t***********************************************");
   log.report();
   $display("\t***********************************************");
   $display("\t***********************************************");
   `vmm_note(this.log," Ending...  report ");
endtask




task env::Global_timeout();
   repeat(time_out) @(posedge host_intf.clk);
endtask

task env::Set_timeout(integer time_out);
   this.time_out = time_out;
endtask

task env::Heart_beat();
   fork
     forever
       begin
         repeat(1000) @(posedge host_intf.clk);
         `vmm_note(this.log,$psprintf(" HeartBeat "));
       end
   join_none
endtask

task env::set_rx_num_pkts (integer num);
   this.rx_num_pkts = num;
endtask

task env::set_tx_num_pkts (integer num);
   this.tx_num_pkts = num;
endtask

`endif