SPI_Test/tb/testbench/awgreg_tb/awgreg_scb.sv

601 lines
20 KiB
Systemverilog
Raw Permalink Normal View History

2024-06-25 16:41:01 +08:00
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<size;i++) begin
addr = base + 4*i;
$display("ScoreBoard: addr:16'h%h",addr);
//if write,COMPARE the "tr" collected from regfile's output port WITH "data" received from SPI
if(din[0]==1'b0) begin
if(data.size()!=size | awg_tr.size!=size) begin
result = 1'b0;
$display("ScoreBoard(ERROR): Size ARNT'T equal!");
$display("Exp size:%0d",data.size());
$display("Act size:%0d",awg_tr.size());
end
else if(addr>=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