class sysreg_env; static int pktnum; //Interface: virtual sysreg_if vif; virtual spi_if wif; virtual sram_if#(25,32) xif; //Component: spi_driver w_driver; sysreg_driver s_driver; spi_monitor w_monitor; sys_refmodel s_model; sysreg_monitor s_monitor; sysreg_scoreboard s_scb; function new(); endfunction; extern function build(); extern task run(); endclass function sysreg_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'b1; w_driver.half_sclk = 4; w_monitor = new(); w_monitor.wif = wif; w_monitor.xif = xif; s_driver = new(); s_driver.vif = vif; s_driver.wif = wif; s_monitor = new(); s_monitor.vif = vif; s_monitor.xif = xif; s_model = new(); s_model.vif = vif; s_model.wif = wif; s_model.xif = xif; s_scb = new(); endfunction task sysreg_env::run(); int error=0; fork w_driver.do_drive(); s_driver.do_drive(); w_monitor.do_mon(); s_monitor.do_mon(); s_model.do_imitate(); while(1) begin repeat(2) @(posedge wif.csn); @(posedge wif.clk); s_model.dout.pop_back(); if(s_scb.compare( s_model.dout , w_monitor.act_trans.data , s_model.sysout , s_monitor.act_trans )) error++; s_model.dout.delete(); s_model.sysout.delete(); s_monitor.act_trans.delete(); end join $display("SCOREBOARD:"); $display("\tError_isr:\t%0d",error); $display("\tError_sysrst:\t%0d",s_model.rst_error[0]); $display("\tError_ch0rst:\t%0d",s_model.rst_error[1]); $display("\tError_ch1rst:\t%0d",s_model.rst_error[2]); $display("\tError_ch2rst:\t%0d",s_model.rst_error[3]); $display("\tError_ch3rst:\t%0d",s_model.rst_error[4]); endtask