class sysreg_scoreboard; int pktnum; virtual spi_if wif; bit my_din[$]; bit[31:0] my_dout[$]; bit[31:0] my_isr; bit[31:0] my_imr; //Vars in intr_check int isr_error=0; function new(); endfunction; extern task do_check(); extern function bit compare( bit din[$], bit[31:0] dout[$], bit[31:0] isr, bit[31:0] imr ); endclass task sysreg_scoreboard::do_check(); int pkt_i=0; fork //sysreg_scoreboard while(1) begin if(pkt_i==pktnum) break; @(posedge wif.csn); repeat(10) @(negedge wif.clk); if(!compare(my_din,my_dout,my_isr,my_imr)) isr_error++; end repeat(pktnum) begin: kill_progress @(negedge wif.csn); pkt_i++; end join endtask function bit sysreg_scoreboard::compare( bit din[$], bit[31:0] dout[$], bit[31:0] isr, bit[31:0] imr ); bit[31:0] data[$]; bit[4 :0] chip; bit[15:0] addr; bit result=1'b1; //$display(dout); chip[ 1: 0] = {>>{din[ 5: 6]}}; addr[15: 0] = {>>{din[11:26]}}; data = {>>{din[32: $]}}; if(chip != 2'b0) begin //result = 1'b0; //$display("ScoreBoard(ERROR): Error chip-select!"); end //if read,Compare the "data" send via MISO With the data written last cycle else if(din[0]) begin $display("\nScoreBoard: addr:16'h%h",addr); if(data.size()!=1 | dout.size()!=1) begin result = 1'b0; $display("ScoreBoard(ERROR): Size ARNT'T equal!"); $display("Exp data size:%0d",data.size()); $display("Act data size:%0d",dout.size()); end else case(addr[15:2]) 14'h00: begin if(dout[0]!=32'h4157_4743) begin result = 1'b0; $display("ScoreBoard(IDRD ERROR):"); $display("\tExp:32'h4157_4743"); $display("\tAct:%b",dout[0]); end else $display("ScoreBoard: IDRD register is read successfully!"); end 14'h01: begin if(dout[0]!=32'h5553_5443) begin result = 1'b0; $display("ScoreBoard(VIDR ERROR):"); $display("\tExp:32'h5553_5443"); $display("\tAct data:%b",dout[0]); end else $display("ScoreBoard: VIDR register is read successfully!"); end 14'h02: begin if(dout[0]!=32'h2022_0831) begin result = 1'b0; $display("ScoreBoard(DATERD ERROR):"); $display("\tExp:32'h2022_0831"); $display("\tAct:%b",dout[0]); end else $display("ScoreBoard: DATERD register is read successfully!"); end 14'h03: begin if(dout[0]!=32'h0000_0001) begin result = 1'b0; $display("ScoreBoard(VERSION ERROR):"); $display("\tExp:32'h0000_0001"); $display("\tAct:%b",dout[0]); end else $display("ScoreBoard: VERSION register is read successfully!"); end 14'h04: begin if(dout[0]!=data[0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp testr:%b",data[0]); $display("\tAct testr:%b",dout[0]); end else $display("ScoreBoard: TESTR register is write&read successfully!"); end 14'h05: begin if(dout[0]!=imr) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp imr:%b",imr); $display("\tAct imr:%b",dout[0]); end else $display("ScoreBoard: IMR register is read successfully!"); end 14'h06: begin if(dout[0]!=isr) begin result = 1'b0; $display("ScoreBoard(ISR ERROR):"); $display("\tExp isr:%b",isr); $display("\tAct isr:%b",dout[0]); end else $display("ScoreBoard: ISR register is read successfully!"); end 14'h07: begin if(dout[0]!=(imr & isr)) begin result = 1'b0; $display("ScoreBoard(misr ERROR):"); $display("\tExp misr:%b",imr & isr); $display("\tAct misr:%b",dout[0]); $display("\tExp imr:%b",imr); $display("\tExp isr:%b",isr); end else $display("ScoreBoard: MISR register is read successfully!"); end 14'h08: begin if(dout[0]!=data[0]) begin result = 1'b0; $display("ScoreBoard(ERROR):"); $display("\tExp soft_rst_time:%b",data[0]); $display("\tAct soft_rst_time:%b",dout[0]); end else $display("ScoreBoard: SFRTR register is write&read successfully!"); end default: begin if(addr<16'h33) $display("ScoreBoard: START A RST!"); else $display("ScoreBoard: Error Address!"); end endcase $display(""); end return result; endfunction