class mcureg_env; static int pktnum; virtual spi_if wif; virtual mcureg_if mif; virtual sram_if xif; spi_driver w_driver; mcureg_driver m_driver; spi_monitor w_monitor; mcureg_monitor m_monitor; mcureg_scoreboard m_scb; function new(); endfunction; extern function build(); extern task run(); endclass: mcureg_env function mcureg_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; //w_driver.half_sclk = 16; 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; w_monitor = new(); w_monitor.pktnum = pktnum; w_monitor.wif = wif; w_monitor.xif = xif; m_scb = new(); m_scb.pktnum = pktnum; m_scb.mif = mif; m_scb.wif = wif; m_scb.xif = xif; endfunction: build task mcureg_env::run(); int pkt_i=0; fork w_driver.do_drive(); m_driver.do_drive(); w_monitor.do_mon(); m_monitor.do_mon(); m_scb.do_check(); //Port: Monitor2Scoreboard while(1) begin if(pkt_i==pktnum) break; @(posedge wif.csn); repeat(9) @(negedge wif.clk); m_scb.din = w_monitor.din; m_scb.dout= w_monitor.dout; m_scb.mcu_tr=m_monitor.mcu_tr; end repeat(pktnum) begin: kill_progress @(negedge wif.csn); pkt_i++; end join $display("SCOREBOARD:"); $display("\tError:\t%0d",m_scb.error); endtask