191 lines
4.6 KiB
Systemverilog
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
|
||
|
|
||
|
|
||
|
|