class awgreg_scoreboard; static int pktnum; virtual spi_if wif; virtual awgreg_if aif; bit din[$]; bit[31:0] dout[$]; awgreg_trans awg_tr[$]; int error=0; int error_fb=0; //FeedBack Static Cache bit[1:0] fsir; function new(); endfunction; extern function bit compare( bit din[$], bit[31:0] dout[$], awgreg_trans awg_tr[$] ); extern task do_check(); endclass: awgreg_scoreboard task awgreg_scoreboard::do_check(); int pkt_i=0; fork //awgreg scoreboard while(1) begin if(pkt_i==pktnum) break; @(posedge wif.csn); repeat(10)@(negedge wif.clk); if(!compare(din,dout,awg_tr)) error++; end //Feedback State checker while(1) begin if(pkt_i==pktnum) break; @(posedge wif.clk); if(aif.fb_st_o != fsir) error_fb++; fsir = aif.fb_st_i[1:0]; end repeat(pktnum) begin: kill_progress @(negedge wif.csn); pkt_i++; end join endtask function bit awgreg_scoreboard::compare( bit din[$], bit[31:0] dout[$], awgreg_trans awg_tr[$] ); bit[31:0] data[$]; bit[4 :0] chip; bit[15:0] base; bit[15:0] addr; 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'b10) begin //result = 1'b0; //$display("ScoreBoard(ERROR): Error chip-select!"); end else begin $display(" "); for(i=0;i=16'h00 && addr<=16'h03) begin if(awg_tr[i].mcu_param0 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_param0:%b",data[i]); $display("\tAct mcu_param0:%b",awg_tr[i].mcu_param0); end else $display("ScoreBoard: MCU_PARA0 register is write successfully!"); end else if(addr>=16'h04 && addr<=16'h07) begin if(awg_tr[i].mcu_param1 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_param1:%b",data[i]); $display("\tAct mcu_param1:%b",awg_tr[i].mcu_param1); end else $display("ScoreBoard: MCU_PARA1 register is write successfully!"); end else if(addr>=16'h08 && addr<=16'h0B) begin if(awg_tr[i].mcu_param2 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_param2:%b",data[i]); $display("\tAct mcu_param2:%b",awg_tr[i].mcu_param2); end else $display("ScoreBoard: MCU_PARA2 register is write successfully!"); end else if(addr>=16'h0C && addr<=16'h0F) begin if(awg_tr[i].mcu_param3 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_param3:%b",data[i]); $display("\tAct mcu_param3:%b",awg_tr[i].mcu_param3); end else $display("ScoreBoard: MCUPARA3 register is write successfully!"); end else if(addr>=16'h100 && addr<=16'h103) begin if((awg_tr[i].mod_sel_sideband) != data[i][0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mod_sel_sideband:%b",data[i][0]); $display("\tAct mod_sel_sideband:%b",awg_tr[i].mod_sel_sideband); end else $display("ScoreBoard: MOD_SEL register is write successfully!"); end else if(addr>=16'h104 && addr<=16'h107) begin if((awg_tr[i].intp_mode) != data[i][2:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp intp_mode:%b",data[i][2:0]); $display("\tAct intp_mode:%b",awg_tr[i].intp_mode); end else $display("ScoreBoard: INTP_MODE register is write successfully!"); end else if(addr>=16'h108 && addr<=16'h10B) begin if(awg_tr[i].qam_nco_clr != data[i][0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_nco_clr:%b",data[i][0]); $display("\tAct qam_nco_clr:%b",awg_tr[i].qam_nco_clr); end else $display("ScoreBoard: NCO_CLR register is write successfully!"); end else if(addr>=16'h10C && addr<=16'h10F) begin if(awg_tr[i].qam_fcw[47:16] != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_fcw[47:16]:%b",data[i]); $display("\tAct qam_fcw[47:16]:%b",awg_tr[i].qam_fcw[47:16]); end else $display("ScoreBoard: FCW_H32bit register is write successfully!"); end else if(addr>=16'h110 && addr<=16'h113) begin if(awg_tr[i].qam_fcw[15:0] != data[i][31:16]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_fcw[15:0]:%b",data[i][31:16]); $display("\tAct qam_fcw[15:0]:%b",awg_tr[i].qam_fcw[15:0]); end else $display("ScoreBoard: FCW_L16bit register is write successfully!"); end else if(addr>=16'h114 && addr<=16'h117) begin if(awg_tr[i].qam_pha != data[i][31:16]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_pha:%b",data[i][31:16]); $display("\tAct qam_pha:%b",awg_tr[i].qam_pha); end else $display("ScoreBoard: PHA register is write successfully!"); end else if(addr>=16'h118 && addr<=16'h11B) begin if(awg_tr[i].qam_sel_sideband != data[i][0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_sel_sideband:%b",data[i][0]); $display("\tAct qam_sel_sideband:%b",awg_tr[i].qam_sel_sideband); end else $display("ScoreBoard: QAM_SEL register is write successfully!"); end else if(addr>=16'h11C && addr<=16'h11F) begin if(awg_tr[i].qam_mod != data[i][1:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp qam_mod:%b",data[i][1:0]); $display("\tAct qam_mod:%b",awg_tr[i].qam_mod); end else $display("ScoreBoard: QAM_MOD register is write successfully!"); end else if(addr>=16'h120 && addr<=16'h123) begin if(awg_tr[i].dac_mode_sel != data[i][1:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp dac_mode_sel:%b",data[i][1:0]); $display("\tAct dac_mode_sel:%b",awg_tr[i].dac_mode_sel); end else $display("ScoreBoard: DAC_MOD register is write successfully!"); end else if(addr>=16'h128 && addr<=16'h12B) begin if(awg_tr[i].intp_sel != data[i][1:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp intp_sel:%b",data[i][1:0]); $display("\tAct intp_sel:%b",awg_tr[i].intp_sel); end else $display("ScoreBoard: INTP_SEL register is write successfully!"); end else if(addr>=16'h12C && addr<=16'h12F) begin if(awg_tr[i].tc_bypass != data[i][0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tc_bypass:%b",data[i][0]); $display("\tAct tc_bypass:%b",awg_tr[i].tc_bypass); end else $display("ScoreBoard: TC_BYPASS register is write successfully!"); end else if(addr>=16'h130 && addr<=16'h133) begin if(awg_tr[i].tcparr0 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr0:%b",data[i]); $display("\tAct tcparr0:%b",awg_tr[i].tcparr0); end else $display("ScoreBoard: TCPA_REAL0 register is write successfully!"); end else if(addr>=16'h134 && addr<=16'h137) begin if(awg_tr[i].tcparr1 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr1:%b",data[i]); $display("\tAct tcparr1:%b",awg_tr[i].tcparr1); end else $display("ScoreBoard: TCPA_REAL1 register is write successfully!"); end else if(addr>=16'h138 && addr<=16'h13B) begin if(awg_tr[i].tcparr2 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr2:%b",data[i]); $display("\tAct tcparr2:%b",awg_tr[i].tcparr2); end else $display("ScoreBoard: TCPA_REAL2 register is write successfully!"); end else if(addr>=16'h13C && addr<=16'h13F) begin if(awg_tr[i].tcparr3 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr3:%b",data[i]); $display("\tAct tcparr3:%b",awg_tr[i].tcparr3); end else $display("ScoreBoard: TCPA_REAL3 register is write successfully!"); end else if(addr>=16'h140 && addr<=16'h143) begin if(awg_tr[i].tcparr4 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr4:%b",data[i]); $display("\tAct tcparr4:%b",awg_tr[i].tcparr4); end else $display("ScoreBoard: TCPA_REAL4 register is write successfully!"); end else if(addr>=16'h144 && addr<=16'h147) begin if(awg_tr[i].tcparr5 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr5:%b",data[i]); $display("\tAct tcparr5:%b",awg_tr[i].tcparr5); end else $display("ScoreBoard: TCPA_REAL5 register is write successfully!"); end else if(addr>=16'h148 && addr<=16'h14B) begin if(awg_tr[i].tcpbrr0 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr0:%b",data[i]); $display("\tAct tcpbrr0:%b",awg_tr[i].tcpbrr0); end else $display("ScoreBoard: TCPB_REAL0 register is write successfully!"); end else if(addr>=16'h14C && addr<=16'h14F) begin if(awg_tr[i].tcpbrr1 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr1:%b",data[i]); $display("\tAct tcpbrr1:%b",awg_tr[i].tcpbrr1); end else $display("ScoreBoard: TCPB_REAL1 register is write successfully!"); end else if(addr>=16'h150 && addr<=16'h153) begin if(awg_tr[i].tcpbrr2 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr2:%b",data[i]); $display("\tAct tcpbrr2:%b",awg_tr[i].tcpbrr2); end else $display("ScoreBoard: TCPB_REAL2 register is write successfully!"); end else if(addr>=16'h154 && addr<=16'h157) begin if(awg_tr[i].tcpbrr3 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr3:%b",data[i]); $display("\tAct tcpbrr3:%b",awg_tr[i].tcpbrr3); end else $display("ScoreBoard: TCPB_REAL3 register is write successfully!"); end else if(addr>=16'h158 && addr<=16'h15B) begin if(awg_tr[i].tcpbrr4 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr4:%b",data[i]); $display("\tAct tcpbrr4:%b",awg_tr[i].tcpbrr4); end else $display("ScoreBoard: TCPB_REAL4 register is write successfully!"); end else if(addr>=16'h15C && addr<=16'h15F) begin if(awg_tr[i].tcpbrr5 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr5:%b",data[i]); $display("\tAct tcpbrr5:%b",awg_tr[i].tcpbrr5); end else $display("ScoreBoard: TCPB_REAL5 register is write successfully!"); end else if(addr>=16'h160 && addr<=16'h163) begin if(awg_tr[i].tcpair0 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpair0:%b",data[i]); $display("\tAct tcpair0:%b",awg_tr[i].tcpair0); end else $display("ScoreBoard: TCPA_IMG0 register is write successfully!"); end else if(addr>=16'h164 && addr<=16'h167) begin if(awg_tr[i].tcpair1 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpair1:%b",data[i]); $display("\tAct tcpair1:%b",awg_tr[i].tcpair1); end else $display("ScoreBoard: TCPA_IMG1 register is write successfully!"); end else if(addr>=16'h168 && addr<=16'h16B) begin if(awg_tr[i].tcpair2 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpair2:%b",data[i]); $display("\tAct tcpair2:%b",awg_tr[i].tcpair2); end else $display("ScoreBoard: TCPA_IMG2 register is write successfully!"); end else if(addr>=16'h16C && addr<=16'h16F) begin if(awg_tr[i].tcpair3 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpair3:%b",data[i]); $display("\tAct tcpair3:%b",awg_tr[i].tcpair3); end else $display("ScoreBoard: TCPA_IMG3 register is write successfully!"); end else if(addr>=16'h170 && addr<=16'h173) begin if(awg_tr[i].tcpair4 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcparr4:%b",data[i]); $display("\tAct tcparr4:%b",awg_tr[i].tcpair4); end else $display("ScoreBoard: TCPA_IMG4 register is write successfully!"); end else if(addr>=16'h174 && addr<=16'h177) begin if(awg_tr[i].tcpair5 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpair5:%b",data[i]); $display("\tAct tcpair5:%b",awg_tr[i].tcpair5); end else $display("ScoreBoard: TCPA_IMG5 register is write successfully!"); end else if(addr>=16'h178 && addr<=16'h17B) begin if(awg_tr[i].tcpbir0 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbir0:%b",data[i]); $display("\tAct tcpbir0:%b",awg_tr[i].tcpbir0); end else $display("ScoreBoard: TCPB_IMG0 register is write successfully!"); end else if(addr>=16'h17C && addr<=16'h17F) begin if(awg_tr[i].tcpbir1 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbir1:%b",data[i]); $display("\tAct tcpbir1:%b",awg_tr[i].tcpbir1); end else $display("ScoreBoard: TCPB_IMG1 register is write successfully!"); end else if(addr>=16'h180 && addr<=16'h183) begin if(awg_tr[i].tcpbir2 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbir2:%b",data[i]); $display("\tAct tcpbir2:%b",awg_tr[i].tcpbir2); end else $display("ScoreBoard: TCPB_IMG2 register is write successfully!"); end else if(addr>=16'h184 && addr<=16'h187) begin if(awg_tr[i].tcpbir3 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbir3:%b",data[i]); $display("\tAct tcpbir3:%b",awg_tr[i].tcpbir3); end else $display("ScoreBoard: TCPB_IMG3 register is write successfully!"); end else if(addr>=16'h188 && addr<=16'h18B) begin if(awg_tr[i].tcpbir4 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbrr4:%b",data[i]); $display("\tAct tcpbrr4:%b",awg_tr[i].tcpbir4); end else $display("ScoreBoard: TCPB_IMG4 register is write successfully!"); end else if(addr>=16'h18C && addr<=16'h18F) begin if(awg_tr[i].tcpbir5 != data[i]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp tcpbir5:%b",data[i]); $display("\tAct tcpbir5:%b",awg_tr[i].tcpbir5); end else $display("ScoreBoard: TCPB_IMG5 register is write successfully!"); end else if(addr>=16'h010 && addr<=16'h01F || addr>=16'h0A0 && addr<=16'h0A3 || addr>=16'h098 && addr<=16'h09F) $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 | awg_tr.size!=size) begin result = 1'b0; $display("ScoreBoard(ERROR): Size ARNT'T equal!"); $display("Exp size:%0d",awg_tr.size()); $display("Act size:%0d",dout.size()); end else if(addr>=16'h10 && addr<=16'h13) begin if(dout[i] != awg_tr[i].mcu_result0) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_result0:%b",awg_tr[i].mcu_result0); $display("\tAct mcu_result0:%b",dout[i]); end else $display("ScoreBoard: awg_PARAM0 register is read successfully!"); end else if(addr>=16'h14 && addr<=16'h17) begin if(dout[i] != awg_tr[i].mcu_result1) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_result1:%b",awg_tr[i].mcu_result1); $display("\tAct mcu_result1:%b",dout[i]); end else $display("ScoreBoard: awg_PARAM1 register is read successfully!"); end else if(addr>=16'h18 && addr<=16'h1B) begin if(dout[i] != awg_tr[i].mcu_result2) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_result2:%b",awg_tr[i].mcu_result2); $display("\tAct mcu_result2:%b",dout[i]); end else $display("ScoreBoard: awg_PARAM2 register is read successfully!"); end else if(addr>=16'h1C && addr<=16'h1F) begin if(dout[i] != awg_tr[i].mcu_result3) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp mcu_result3:%b",awg_tr[i].mcu_result3); $display("\tAct mcu_result3:%b",dout[i]); end else $display("ScoreBoard: awg_PARAM2 register is read successfully!"); end else if(addr>=16'h98 && addr<=16'h9B) begin if(dout[i] != awg_tr[i].run_time) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp run_time:%b",awg_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] != awg_tr[i].instr_num) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp instr_num:%b",awg_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] != awg_tr[i].fb_st_i[1:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp fb_st_i:%b",awg_tr[i].fb_st_i[1:0]); $display("\tAct fb_st_i:%b",dout[i]); end else $display("ScoreBoard: FSIR register is read successfully!"); end else if(addr>=16'h000 && addr<=16'h00F || addr>=16'h10C && addr<=16'h10F || addr>=16'h130 && addr<=16'h18F) begin if(dout[i] != data[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'h110 && addr<=16'h117) begin if(dout[i][15:0] != data[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'h104 && addr<=16'h107) begin if(dout[i][2:0] != data[i][2:0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp miso:%b",data[i][2:0]); $display("\tAct miso:%b",dout[i][2:0]); end else $display("ScoreBoard: 3bit register is write&read successfully!"); end else if(addr>=16'h11C && addr<=16'h12B) begin if(dout[i][1:0] != data[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: 2bit register is write&read successfully!"); end else if(addr>=16'h100 && addr<=16'h103 || addr>=16'h108 && addr<=16'h10B || addr>=16'h118 && addr<=16'h11B || addr>=16'h12C && addr<=16'h12F) begin if(dout[i][0] != data[i][0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp miso:%b",data[i][0]); $display("\tAct miso:%b",dout[i][0]); end else $display("ScoreBoard: 1bit register is write&read successfully!"); end else begin result = 1'b0; $display("ScoreBoard: Error Address!"); end end//end_ifelse end//end_for $display(""); end return result; endfunction: compare