SPI_Test/tb/testbench/mcureg_tb/mcureg_scb.sv

472 lines
17 KiB
Systemverilog

class mcureg_scoreboard;
static int pktnum;
virtual spi_if wif;
virtual mcureg_if mif;
virtual sram_if xif;
bit din[$];
bit[31:0] dout[$];
mcureg_trans mcu_tr[$];
int error=0;
function new();
endfunction;
extern function bit compare(
bit din[$],
bit[31:0] dout[$],
mcureg_trans mcu_tr[$]
);
extern task do_check();
endclass: mcureg_scoreboard
task mcureg_scoreboard::do_check();
int pkt_i;
int i=0,j=0;
fork
//mcureg_scoreboard
while(1) begin: scb
if(pkt_i==pktnum) break;
@(posedge wif.csn);
repeat(10)@(negedge wif.clk);
if(!compare(din,dout,mcu_tr))
error++;
end: scb
repeat(pktnum) begin: kill_progress
@(negedge wif.csn);
pkt_i++;
end: kill_progress
join
endtask: do_check
function bit mcureg_scoreboard::compare(
bit din[$],
bit[31:0] dout[$],
mcureg_trans mcu_tr[$]
);
bit[31:0] data[$];
bit[4 :0] chip;
bit[15:0] base;
bit[15:0] addr;
bit[31:0] mask[$];
int size;
bit result=1'b1;
int i=0;
//$display(din);
chip[1 : 0] = {>>{din[ 5: 6]}};
base[15: 0] = {>>{din[11:26]}};
data = {>>{din[32: $]}};
size = din[1] ? 16 : 1;
if(chip != 2'b1) begin
//result = 1'b0;
//$display("ScoreBoard(ERROR): Error chip-select!");
end
else begin
$display(" ");
for(i=0;i<size;i++) begin
addr = base + 4*i;
mask[i] = {{8{mcu_tr[i].wrmask[3]}},{8{mcu_tr[i].wrmask[2]}},{8{mcu_tr[i].wrmask[1]}},{8{mcu_tr[i].wrmask[0]}}};
$display("ScoreBoard: addr:16'h%h",addr);
//$display("ScoreBoard: mask:%b",mcu_tr[i].wrmask);
//if write,COMPARE the "tr" collected from regfile's output port WITH "data" received from SPI
if(din[0]==1'b0) begin
if(data.size()!=size | mcu_tr.size!=size) begin
result = 1'b0;
$display("ScoreBoard(ERROR): Size ARNT'T equal!");
$display("Exp size:%0d",data.size());
$display("Act size:%0d",mcu_tr.size());
end
else if(addr>=16'h10 && addr<=16'h13) begin
if((mcu_tr[i].mcu_result[0] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_res0:%b",data[i]);
$display("\tAct mcu_res0:%b",mcu_tr[i].mcu_result[0]); end
else $display("ScoreBoard: MCU_RES0 register is write successfully!");
end
else if(addr>=16'h14 && addr<=16'h17) begin
if((mcu_tr[i].mcu_result[1] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_res1:%b",data[i]);
$display("\tAct mcu_res1:%b",mcu_tr[i].mcu_result[1]); end
else $display("ScoreBoard: MCU_RES1 register is write successfully!");
end
else if(addr>=16'h18 && addr<=16'h1B) begin
if((mcu_tr[i].mcu_result[2] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_res2:%b",data[i]);
$display("\tAct mcu_res2:%b",mcu_tr[i].mcu_result[2]); end
else $display("ScoreBoard: MCU_RES2 register is write successfully!");
end
else if(addr>=16'h1C && addr<=16'h1F) begin
if((mcu_tr[i].mcu_result[3] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_res3:%b",data[i]);
$display("\tAct mcu_res3:%b",mcu_tr[i].mcu_result[3]); end
else $display("ScoreBoard: MCU_RES3 register is write successfully!");
end
else if(addr>=16'h40 && addr<=16'h43) begin
if((mcu_tr[i].mcu_cwfr[0] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_cwfr0:%b",data[i]);
$display("\tAct mcu_cwfr0:%b",mcu_tr[i].mcu_cwfr[0]); end
else $display("ScoreBoard: MCU_CWFR0 register is write successfully!");
end
else if(addr>=16'h44 && addr<=16'h47) begin
if((mcu_tr[i].mcu_cwfr[1] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_cwfr1:%b",data[i]);
$display("\tAct mcu_cwfr1:%b",mcu_tr[i].mcu_cwfr[1]); end
else $display("ScoreBoard: MCU_CWFR1 register is write successfully!");
end
else if(addr>=16'h48 && addr<=16'h4B) begin
if((mcu_tr[i].mcu_cwfr[2] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_cwfr2:%b",data[i]);
$display("\tAct mcu_cwfr2:%b",mcu_tr[i].mcu_cwfr[2]); end
else $display("ScoreBoard: MCU_CWFR2 register is write successfully!");
end
else if(addr>=16'h4C && addr<=16'h4F) begin
if((mcu_tr[i].mcu_cwfr[3] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_cwfr3:%b",data[i]);
$display("\tAct mcu_cwfr3:%b",mcu_tr[i].mcu_cwfr[3]); end
else $display("ScoreBoard: MCU_CWFR3 register is write successfully!");
end
else if(addr>=16'h54 && addr<=16'h57) begin
if((mcu_tr[i].mcu_gapr[0][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr0:%b",data[i][31:16]);
$display("\tAct mcu_gapr0:%b",mcu_tr[i].mcu_gapr[0][15:0]); end
else $display("ScoreBoard: MCU_GAPR0 register is write successfully!");
end
else if(addr>=16'h58 && addr<=16'h5B) begin
if((mcu_tr[i].mcu_gapr[1][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr1:%b",data[i][31:16]);
$display("\tAct mcu_gapr1:%b",mcu_tr[i].mcu_gapr[1][15:0]); end
else $display("ScoreBoard: MCU_GAPR1 register is write successfully!");
end
else if(addr>=16'h5C && addr<=16'h5F) begin
if((mcu_tr[i].mcu_gapr[2][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr2:%b",data[i][31:16]);
$display("\tAct mcu_gapr2:%b",mcu_tr[i].mcu_gapr[2][15:0]); end
else $display("ScoreBoard: MCU_GAPR2 register is write successfully!");
end
else if(addr>=16'h60 && addr<=16'h63) begin
if((mcu_tr[i].mcu_gapr[3][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr3:%b",data[i][31:16]);
$display("\tAct mcu_gapr3:%b",mcu_tr[i].mcu_gapr[3][15:0]); end
else $display("ScoreBoard: MCU_GAPR3 register is write successfully!");
end
else if(addr>=16'h64 && addr<=16'h67) begin
if((mcu_tr[i].mcu_gapr[4][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr4:%b",data[i][31:16]);
$display("\tAct mcu_gapr4:%b",mcu_tr[i].mcu_gapr[4][15:0]); end
else $display("ScoreBoard: MCU_GAPR4 register is write successfully!");
end
else if(addr>=16'h68 && addr<=16'h6B) begin
if((mcu_tr[i].mcu_gapr[5][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr5:%b",data[i][31:16]);
$display("\tAct mcu_gapr5:%b",mcu_tr[i].mcu_gapr[5][15:0]); end
else $display("ScoreBoard: MCU_GAPR5 register is write successfully!");
end
else if(addr>=16'h6C && addr<=16'h6F) begin
if((mcu_tr[i].mcu_gapr[6][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr6:%b",data[i][31:16]);
$display("\tAct mcu_gapr6:%b",mcu_tr[i].mcu_gapr[6][15:0]); end
else $display("ScoreBoard: MCU_GAPR6 register is write successfully!");
end
else if(addr>=16'h70 && addr<=16'h73) begin
if((mcu_tr[i].mcu_gapr[7][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_gapr7:%b",data[i][31:16]);
$display("\tAct mcu_gapr7:%b",mcu_tr[i].mcu_gapr[7][15:0]); end
else $display("ScoreBoard: MCU_GAPR7 register is write successfully!");
end
else if(addr>=16'h78 && addr<=16'h7B) begin
if((mcu_tr[i].mcu_ampr[0][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_ampr0:%b",data[i][31:16]);
$display("\tAct mcu_ampr0:%b",mcu_tr[i].mcu_ampr[0][15:0]); end
else $display("ScoreBoard: MCU_AMPR0 register is write successfully!");
end
else if(addr>=16'h7C && addr<=16'h7F) begin
if((mcu_tr[i].mcu_ampr[1][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_ampr1:%b",data[i][31:16]);
$display("\tAct mcu_ampr1:%b",mcu_tr[i].mcu_ampr[1][15:0]); end
else $display("ScoreBoard: MCU_AMPR1 register is write successfully!");
end
else if(addr>=16'h80 && addr<=16'h83) begin
if((mcu_tr[i].mcu_ampr[2][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_ampr2:%b",data[i][31:16]);
$display("\tAct mcu_ampr2:%b",mcu_tr[i].mcu_ampr[2][15:0]); end
else $display("ScoreBoard: MCU_AMPR2 register is write successfully!");
end
else if(addr>=16'h84 && addr<=16'h87) begin
if((mcu_tr[i].mcu_ampr[3][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_ampr3:%b",data[i][31:16]);
$display("\tAct mcu_ampr3:%b",mcu_tr[i].mcu_ampr[3][15:0]); end
else $display("ScoreBoard: MCU_AMPR3 register is write successfully!");
end
else if(addr>=16'h88 && addr<=16'h8B) begin
if((mcu_tr[i].mcu_baisr[0][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_baisr0:%b",data[i][31:16]);
$display("\tAct mcu_baisr0:%b",mcu_tr[i].mcu_baisr[0][15:0]); end
else $display("ScoreBoard: MCU_BAIS0 register is write successfully!");
end
else if(addr>=16'h8C && addr<=16'h8F) begin
if((mcu_tr[i].mcu_baisr[1][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_baisr1:%b",data[i][31:16]);
$display("\tAct mcu_baisr1:%b",mcu_tr[i].mcu_baisr[1][15:0]); end
else $display("ScoreBoard: MCU_BAIS1 register is write successfully!");
end
else if(addr>=16'h90 && addr<=16'h93) begin
if((mcu_tr[i].mcu_baisr[2][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_baisr2:%b",data[i][31:16]);
$display("\tAct mcu_baisr2:%b",mcu_tr[i].mcu_baisr[2][15:0]); end
else $display("ScoreBoard: MCU_BAIS2 register is write successfully!");
end
else if(addr>=16'h94 && addr<=16'h97) begin
if((mcu_tr[i].mcu_baisr[3][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_baisr3:%b",data[i][31:16]);
$display("\tAct mcu_baisr3:%b",mcu_tr[i].mcu_baisr[3][15:0]); end
else $display("ScoreBoard: MCU_BAIS3 register is write successfully!");
end
else if(addr>=16'h50 && addr<=16'h53) begin
if((mcu_tr[i].mcu_nco_pha_clr & mask[i][0]) != (data[i][0] & mask[i][0])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_nco_pha_clr:%b",data[i][0]);
$display("\tAct mcu_nco_pha_clr:%b",mcu_tr[i].mcu_nco_pha_clr); end
else $display("ScoreBoard: PHA_CLR register is write successfully!");
end
else if(addr>=16'hA4 && addr<=16'hA7) begin
if((mcu_tr[i].mcu_intp_sel & mask[i][1:0]) != (data[i][1:0] & mask[i][1:0])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_intp_sel:%b",data[i][1:0]);
$display("\tAct mcu_intp_sel:%b",mcu_tr[i].mcu_intp_sel); end
else $display("ScoreBoard: INTP_SEL register is write successfully!");
end
else if(addr>=16'h74 && addr<=16'h77) begin
if((mcu_tr[i].mcu_rz_pha & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_rz_pha:%b",data[i][31:16]);
$display("\tAct mcu_rz_pha:%b",mcu_tr[i].mcu_rz_pha); end
else $display("ScoreBoard: RZ_PHA register is write successfully!");
end
else if(addr>=16'h00 && addr<=16'h0F | addr>=16'h98 && addr<=16'hA3)
$display("ScoreBoard: read-only register.");
else begin result = 1'b0; $display("ScoreBoard: Error Address!"); end
end
//if read,COMPARE the "dout" sent by SPI WITH the "tr" collected from regfile's input port or the "data" received last write
else begin
if(dout.size()!=size | mcu_tr.size!=size) begin
result = 1'b0;
$display("ScoreBoard(ERROR): Size ARNT'T equal!");
$display("Exp size:%0d",mcu_tr.size());
$display("Act size:%0d",dout.size());
end
else if(addr>=16'h00 && addr<=16'h03) begin
if(dout[i] != mcu_tr[i].mcu_param[0]) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_param0:%b",mcu_tr[i].mcu_param[0]);
$display("\tAct mcu_param0:%b",dout[i]); end
else $display("ScoreBoard: MCU_PARAM0 register is read successfully!");
end
else if(addr>=16'h04 && addr<=16'h07) begin
if(dout[i] != mcu_tr[i].mcu_param[1]) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_param1:%b",mcu_tr[i].mcu_param[1]);
$display("\tAct mcu_param1:%b",dout[i]); end
else $display("ScoreBoard: MCU_PARAM1 register is read successfully!");
end
else if(addr>=16'h08 && addr<=16'h0B) begin
if(dout[i] != mcu_tr[i].mcu_param[2]) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_param2:%b",mcu_tr[i].mcu_param[2]);
$display("\tAct mcu_param2:%b",dout[i]); end
else $display("ScoreBoard: MCU_PARAM2 register is read successfully!");
end
else if(addr>=16'h0C && addr<=16'h0F) begin
if(dout[i] != mcu_tr[i].mcu_param[3]) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp mcu_param3:%b",mcu_tr[i].mcu_param[3]);
$display("\tAct mcu_param3:%b",dout[i]); end
else $display("ScoreBoard: MCU_PARAM2 register is read successfully!");
end
else if(addr>=16'h98 && addr<=16'h9B) begin
if(dout[i] != mcu_tr[i].run_time) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp run_time:%b",mcu_tr[i].run_time);
$display("\tAct run_time:%b",dout[i]); end
else $display("ScoreBoard: RUN_TIME register is read successfully!");
end
else if(addr>=16'h9C && addr<=16'h9F) begin
if(dout[i] != mcu_tr[i].instr_num) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp instr_num:%b",mcu_tr[i].instr_num);
$display("\tAct instr_num:%b",dout[i]); end
else $display("ScoreBoard: INSTR_NUM register is read successfully!");
end
else if(addr>=16'hA0 && addr<=16'hA3) begin
if(dout[i][1:0] != mcu_tr[i].fb_st_info[1:0]) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp fb_st_info:%b",mcu_tr[i].fb_st_info[1:0]);
$display("\tAct fb_st_info:%b",dout[i]); end
else $display("ScoreBoard: FSIR register is read successfully!");
end
else if(addr>=16'h10 && addr<=16'h1F |
addr>=16'h40 && addr<=16'h4F) begin
if((dout[i] & mask[i]) != (data[i] & mask[i])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp miso:%b",data[i]);
$display("\tAct miso:%b",dout[i]); end
else $display("ScoreBoard: 32bit register is write&read successfully!");
end
else if(addr>=16'h54 && addr<=16'h97) begin
if((dout[i][15:0] & mask[i][31:16]) != (data[i][31:16] & mask[i][31:16])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp miso:%b",data[i][31:16]);
$display("\tAct miso:%b",dout[i][15:0]); end
else $display("ScoreBoard: 16bit register is write&read successfully!");
end
else if(addr>=16'hA4 && addr<=16'hA7) begin
if((dout[i][1:0] & mask[i][1:0]) != (data[i][1:0] & mask[i][1:0])) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp miso:%b",data[i][1:0]);
$display("\tAct miso:%b",dout[i][1:0]); end
else $display("ScoreBoard: INTP_SEL register is write&read successfully!");
end
else if(addr>=16'h50 && addr<=16'h53) begin
if(dout[i][0] != 0) begin
result = 1'b0;
$display("ScoreBoard(ERROR):");
$display("\tExp miso:0");
$display("\tAct miso:%b",dout[i][0]); end
else $display("ScoreBoard: clr_pha read value 1'b0!");
end
else begin result = 1'b0; $display("ScoreBoard: Error Address!"); end
end//end_if(cmd[0])
end//end_for(size)
$display("");
end//end_if(chip)
return result;
endfunction: compare