166 lines
3.3 KiB
Systemverilog
166 lines
3.3 KiB
Systemverilog
class env;
|
|
|
|
|
|
static int pktnum;
|
|
|
|
//Interface:
|
|
virtual spi_if wif;
|
|
virtual sysreg_if vif;
|
|
virtual awgreg_if aif;
|
|
virtual mcureg_if mif;
|
|
virtual sram_if xif;
|
|
|
|
//Component:
|
|
spi_driver w_driver;
|
|
spi_monitor w_monitor;
|
|
|
|
sysreg_driver s_driver;
|
|
spi2sysreg_refmodel s_mdl;
|
|
sysreg_scoreboard s_scb;
|
|
|
|
mcureg_driver m_driver;
|
|
mcureg_monitor m_monitor;
|
|
mcureg_scoreboard m_scb;
|
|
|
|
awgreg_driver a_driver;
|
|
awgreg_monitor a_monitor;
|
|
awgreg_scoreboard a_scb;
|
|
|
|
function new();
|
|
endfunction;
|
|
|
|
extern function build();
|
|
|
|
extern task run();
|
|
|
|
endclass: env
|
|
|
|
function 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;
|
|
|
|
w_monitor=new();
|
|
w_monitor.pktnum = pktnum;
|
|
w_monitor.wif = wif;
|
|
w_monitor.xif = xif;
|
|
|
|
s_driver = new();
|
|
s_driver.pktnum = pktnum;
|
|
s_driver.vif = vif;
|
|
s_driver.wif = wif;
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
m_scb = new();
|
|
m_scb.pktnum = pktnum;
|
|
m_scb.mif = mif;
|
|
m_scb.wif = wif;
|
|
m_scb.xif = xif;
|
|
|
|
a_driver = new();
|
|
a_driver.pktnum = pktnum;
|
|
a_driver.aif = aif;
|
|
a_driver.wif = wif;
|
|
|
|
a_monitor = new();
|
|
a_monitor.pktnum = pktnum;
|
|
a_monitor.aif = aif;
|
|
a_monitor.wif = wif;
|
|
a_monitor.xif = xif;
|
|
|
|
a_scb = new();
|
|
a_scb.pktnum = pktnum;
|
|
a_scb.aif = aif;
|
|
a_scb.wif = wif;
|
|
|
|
endfunction
|
|
|
|
|
|
task env::run();
|
|
int pkt_i=0;
|
|
|
|
fork
|
|
|
|
w_driver.do_drive();
|
|
s_driver.do_drive();
|
|
m_driver.do_drive();
|
|
a_driver.do_drive();
|
|
|
|
|
|
w_monitor.do_mon();
|
|
s_mdl.do_imitate();
|
|
m_monitor.do_mon();
|
|
a_monitor.do_mon();
|
|
|
|
|
|
s_scb.do_check();
|
|
m_scb.do_check();
|
|
a_scb.do_check();
|
|
|
|
|
|
while(1) begin: scb
|
|
if(pkt_i==pktnum) break;
|
|
@(posedge wif.csn);
|
|
repeat(9) @(negedge wif.clk);
|
|
a_scb.din = w_monitor.din;
|
|
a_scb.dout = w_monitor.dout;
|
|
a_scb.awg_tr = a_monitor.awg_tr;
|
|
m_scb.din = w_monitor.din;
|
|
m_scb.dout= w_monitor.dout;
|
|
m_scb.mcu_tr=m_monitor.mcu_tr;
|
|
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("SYSTEM_REGFILE:");
|
|
$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]);
|
|
$display("MCU_REGFILE:");
|
|
$display("\tError:\t\t%0d",m_scb.error);
|
|
$display("AWG_REGFILE:");
|
|
$display("\tError:\t\t%0d",a_scb.error);
|
|
$display("\tError_FB:\t%0d",a_scb.error_fb);
|
|
|
|
endtask
|
|
|