SPI_Test/tb/testbench/sysreg_tb/sysreg_scb.sv

191 lines
4.6 KiB
Systemverilog

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