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=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