Code Browser Pages:
| // 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 |