SPI_Test/tb/testbench/sysreg_tb/sysreg_env.sv

104 lines
1.9 KiB
Systemverilog

class sysreg_env;
static int pktnum;
//Interface:
virtual sysreg_if vif;
virtual spi_if wif;
virtual sram_if xif;
//Component:
spi_driver w_driver;
sysreg_driver s_driver;
spi_monitor w_monitor;
spi2sysreg_refmodel s_mdl;
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'b0;
//my_driver.half_sclk = 16;
s_driver = new();
s_driver.pktnum = pktnum;
s_driver.vif = vif;
s_driver.wif = wif;
w_monitor=new();
w_monitor.pktnum = pktnum;
w_monitor.wif = wif;
w_monitor.xif = xif;
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;
endfunction
task sysreg_env::run();
int pkt_i=0;
fork
w_driver.do_drive();
s_driver.do_drive();
w_monitor.do_mon();
s_mdl.do_imitate();
s_scb.do_check();
//Port: monitor2scoreboard
while(1) begin: scb
if(pkt_i==pktnum) break;
@(posedge wif.csn);
repeat(9) @(negedge wif.clk);
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("\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]);
endtask