SPI_Test/tb/sysreg_tb/sysreg_env.sv

108 lines
2.0 KiB
Systemverilog

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