class env; static int pktnum; //Interface: virtual spi_if wif; virtual sysreg_if vif; virtual awgreg_if aif; virtual mcureg_if mif; virtual sram_if xif; //Component: spi_driver w_driver; spi_monitor w_monitor; sysreg_driver s_driver; spi2sysreg_refmodel s_mdl; sysreg_scoreboard s_scb; mcureg_driver m_driver; mcureg_monitor m_monitor; mcureg_scoreboard m_scb; awgreg_driver a_driver; awgreg_monitor a_monitor; awgreg_scoreboard a_scb; function new(); endfunction; extern function build(); extern task run(); endclass: env function env::build(); w_driver = new(); if(!w_driver.randomize() with { error_time == 0; }) $fatal(0,"Randomize Failed"); w_driver.pktnum = pktnum; w_driver.vif = wif; w_driver.autarchy = 1'b0; //my_driver.half_sclk = 16; w_monitor=new(); w_monitor.pktnum = pktnum; w_monitor.wif = wif; w_monitor.xif = xif; s_driver = new(); s_driver.pktnum = pktnum; s_driver.vif = vif; s_driver.wif = wif; s_mdl=new(); s_mdl.pktnum = pktnum; s_mdl.vif = vif; s_mdl.wif = wif; s_mdl.xif = xif; s_scb=new(); s_scb.pktnum = pktnum; s_scb.wif = wif; m_driver = new(); m_driver.pktnum = pktnum; m_driver.mif = mif; m_driver.wif = wif; m_monitor = new(); m_monitor.pktnum = pktnum; m_monitor.mif = mif; m_monitor.wif = wif; m_monitor.xif = xif; m_scb = new(); m_scb.pktnum = pktnum; m_scb.mif = mif; m_scb.wif = wif; m_scb.xif = xif; a_driver = new(); a_driver.pktnum = pktnum; a_driver.aif = aif; a_driver.wif = wif; a_monitor = new(); a_monitor.pktnum = pktnum; a_monitor.aif = aif; a_monitor.wif = wif; a_monitor.xif = xif; a_scb = new(); a_scb.pktnum = pktnum; a_scb.aif = aif; a_scb.wif = wif; endfunction task env::run(); int pkt_i=0; fork w_driver.do_drive(); s_driver.do_drive(); m_driver.do_drive(); a_driver.do_drive(); w_monitor.do_mon(); s_mdl.do_imitate(); m_monitor.do_mon(); a_monitor.do_mon(); s_scb.do_check(); m_scb.do_check(); a_scb.do_check(); while(1) begin: scb if(pkt_i==pktnum) break; @(posedge wif.csn); repeat(9) @(negedge wif.clk); a_scb.din = w_monitor.din; a_scb.dout = w_monitor.dout; a_scb.awg_tr = a_monitor.awg_tr; m_scb.din = w_monitor.din; m_scb.dout= w_monitor.dout; m_scb.mcu_tr=m_monitor.mcu_tr; s_scb.my_din = w_monitor.din; s_scb.my_dout = w_monitor.dout; s_scb.my_isr = s_mdl.isr; s_scb.my_imr = s_mdl.imr; end repeat(pktnum) begin: kill_progress @(negedge wif.csn); pkt_i++; end join $display("SCOREBOARD:"); $display("SYSTEM_REGFILE:"); $display("\tError_isr:\t%0d",s_scb.isr_error); $display("\tError_sysrst:\t%0d",s_mdl.rst_error[0]); $display("\tError_mcurst:\t%0d",s_mdl.rst_error[1]); $display("\tError_awgrst:\t%0d",s_mdl.rst_error[2]); $display("\tError_dacrst:\t%0d",s_mdl.rst_error[3]); $display("MCU_REGFILE:"); $display("\tError:\t\t%0d",m_scb.error); $display("AWG_REGFILE:"); $display("\tError:\t\t%0d",a_scb.error); $display("\tError_FB:\t%0d",a_scb.error_fb); endtask