SPI_Test/tb/env.sv

178 lines
7.9 KiB
Systemverilog

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