178 lines
7.9 KiB
Systemverilog
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
|
|
|