class env; static int pktnum; int s_error =0; int p_error =0; int d_error =0; int m_error =0; int a_error =0; int inst_error =0; int data_error =0; int envID_error =0; int envData_error =0; int dbg_error =0; integer fid; //Interface: virtual spi_if wif; virtual pllreg_if pif; virtual dacreg_if dif; virtual sysreg_if vif; virtual awgreg_if aif; virtual mcureg_if mif; virtual sram_if#(25,32) xif; //Component: spi_driver w_drv; spi_monitor w_mon; pllreg_driver p_drv; pllreg_monitor p_mon; pll_refmodel p_mdl ; pllreg_scoreboard p_scb ; dacreg_monitor d_mon; dac_refmodel d_mdl ; dacreg_scoreboard d_scb ; sysreg_monitor s_mon; sys_refmodel s_mdl ; sysreg_scoreboard s_scb ; mcureg_monitor m_mon; mcu_refmodel m_mdl ; mcureg_scoreboard m_scb ; awgreg_monitor a_mon; awg_refmodel a_mdl ; awgreg_scoreboard a_scb ; ram_refmodel inst_mdl ; ramreg_scoreboard inst_scb ; ram_refmodel data_mdl ; ramreg_scoreboard data_scb ; ram_refmodel envID_mdl ; ramreg_scoreboard envID_scb ; ram_refmodel envData_mdl; ramreg_scoreboard envData_scb; ram_refmodel dbg_mdl ; ramreg_scoreboard dbg_scb ; function new(); endfunction; extern function build(); extern task run(); endclass: env function env::build(); fid = $fopen("./reports.txt"); w_drv = new(); if(!w_drv.randomize() with { error_time == 0; }) $fatal(0,"Randomize Failed"); w_drv.pktnum = pktnum; w_drv.vif=wif; w_drv.autarchy = 1'b1 ; w_drv.half_sclk = 16 ; w_mon = new(); w_mon.wif=wif; w_mon.xif=xif; w_mon.fid=fid; p_drv = new(); p_drv.pif=pif; p_drv.wif=wif; p_mon = new(); p_mon.pif=pif; p_mon.xif=xif; p_mon.wif=wif; p_mdl = new(); p_mdl.pif=pif; p_mdl.xif=xif; p_mdl.wif=wif; p_scb = new(); p_scb.fid=fid; d_mon = new(); d_mon.dif=dif; d_mon.xif=xif; d_mon.wif=wif; d_mdl = new(); d_mdl.dif=dif; d_mdl.xif=xif; d_mdl.wif=wif; d_scb = new(); d_scb.fid=fid; s_mon = new(); s_mon.vif=vif; s_mon.xif=xif; s_mdl = new(); s_mdl.vif=vif; s_mdl.xif=xif; s_mdl.wif=wif; s_scb = new(); s_scb.fid=fid; m_mon = new(); m_mon.mif=mif; m_mon.xif=xif; m_mdl = new(); m_mdl.mif=mif; m_mdl.xif=xif; m_mdl.wif=wif; m_scb = new(); m_scb.fid=fid; a_mon = new(); a_mon.aif=aif; a_mon.xif=xif; a_mdl = new(); a_mdl.aif=aif; a_mdl.xif=xif; a_mdl.wif=wif; a_scb = new(); a_scb.fid=fid; //sel 1 for 8192, 2 for 64, 3 for 1024 inst_mdl = new(); data_mdl = new(); envID_mdl = new(); inst_mdl.xif=xif; data_mdl.xif=xif; envID_mdl.xif=xif; inst_mdl.wif=wif; data_mdl.wif=wif; envID_mdl.wif=wif; inst_mdl.base_addr = 5'h1; data_mdl.base_addr = 5'h2; envID_mdl.base_addr = 5'h4; inst_mdl.sel=1; data_mdl.sel=1; envID_mdl.sel=2; inst_scb = new(); data_scb = new(); envID_scb = new(); inst_scb.fid=fid; data_scb.fid=fid; envID_scb.fid=fid; envData_mdl = new(); dbg_mdl = new(); envData_mdl.xif=xif; dbg_mdl.xif=xif; envData_mdl.wif=wif; dbg_mdl.wif=wif; envData_mdl.base_addr = 5'h5; dbg_mdl.base_addr = 5'h19; envData_mdl.sel=1; dbg_mdl.sel=3; envData_scb = new(); dbg_scb = new(); envData_scb.fid=fid; dbg_scb.fid=fid; endfunction task env::run(); fork w_drv.do_drive(); w_mon.do_mon(); p_drv.do_drive(); p_mon.do_mon(); p_mdl.do_imitate(); d_mon.do_mon(); d_mdl.do_imitate(); s_mon.do_mon(); s_mdl.do_imitate(); m_mon.do_mon(); m_mdl.do_imitate(); a_mon.do_mon(); a_mdl.do_imitate(); inst_mdl.do_imitate(); data_mdl.do_imitate(); envID_mdl.do_imitate(); envData_mdl.do_imitate(); dbg_mdl.do_imitate(); while(1) begin repeat(2) @(posedge wif.csn); @(posedge wif.clk); p_mdl.dout.pop_back() ; d_mdl.dout.pop_back() ; s_mdl.dout.pop_back() ; m_mdl.dout.pop_back() ; a_mdl.dout.pop_back() ; inst_mdl.dout.pop_back() ; data_mdl.dout.pop_back() ; envID_mdl.dout.pop_back() ; envData_mdl.dout.pop_back(); dbg_mdl.dout.pop_back() ; case(xif.addr[24:20]) 5'b00000: if(s_scb.compare(s_mdl.dout, w_mon.act_trans.data, s_mdl.sysout, s_mon.act_trans)) s_error++ ; 5'b00001: if(inst_scb.compare(inst_mdl.dout, w_mon.act_trans.data )) inst_error++ ; 5'b00010: if(data_scb.compare(data_mdl.dout, w_mon.act_trans.data )) data_error++ ; 5'b00011: if(a_scb.compare(a_mdl.dout, w_mon.act_trans.data, a_mdl.awgout, a_mon.act_trans)) a_error++ ; 5'b00100: if(envID_scb.compare(envID_mdl.dout, w_mon.act_trans.data )) envID_error++ ; 5'b00101: if(envData_scb.compare(envData_mdl.dout, w_mon.act_trans.data )) envData_error++; 5'b00110: if(d_scb.compare(d_mdl.dout, w_mon.act_trans.data, d_mdl.dacout, d_mon.act_trans)) d_error++ ; 5'b00111: if(m_scb.compare(m_mdl.dout, w_mon.act_trans.data, m_mdl.mcuout, m_mon.act_trans)) m_error++ ; 5'b11001: if(dbg_scb.compare(dbg_mdl.dout, w_mon.act_trans.data )) dbg_error++ ; 5'b11111: if(p_scb.compare(p_mdl.dout, w_mon.act_trans.data, p_mdl.pllout, p_mon.act_trans)) p_error++ ; endcase p_mdl.dout.delete() ; p_mdl.pllout.delete() ; p_mon.act_trans.delete(); d_mdl.dout.delete() ; d_mdl.dacout.delete() ; d_mon.act_trans.delete(); s_mdl.dout.delete() ; s_mdl.sysout.delete() ; s_mon.act_trans.delete(); m_mdl.dout.delete() ; m_mdl.mcuout.delete() ; m_mon.act_trans.delete(); a_mdl.dout.delete() ; a_mdl.awgout.delete() ; a_mon.act_trans.delete(); inst_mdl.dout.delete() ; inst_mdl.ramout.delete() ; data_mdl.dout.delete() ; data_mdl.ramout.delete() ; envID_mdl.dout.delete() ; envID_mdl.ramout.delete() ; envData_mdl.dout.delete(); envData_mdl.ramout.delete(); dbg_mdl.dout.delete() ; dbg_mdl.ramout.delete() ; end join $display("SCOREBOARD:"); $display("INTPLL_REGFILE:"); $display("\tError:\t\t%0d",p_error); $display("SYSTEM_REGFILE:"); $display("\tError:\t\t%0d",s_error); $display("\tError_sysrst:\t%0d",s_mdl.rst_error[0]); $display("\tError_ch0rst:\t%0d",s_mdl.rst_error[1]); $display("\tError_ch1rst:\t%0d",s_mdl.rst_error[2]); $display("\tError_ch2rst:\t%0d",s_mdl.rst_error[3]); $display("\tError_ch3rst:\t%0d",s_mdl.rst_error[3]); $display("MCU_REGFILE:"); $display("\tError:\t\t%0d",m_error); $display("AWG_REGFILE:"); $display("\tError:\t\t%0d",a_error); endtask