`ifndef SCOREBOARD_SV
`define SCOREBOARD_SV
class scoreboard;
mailbox mon2scb_mbx = new();
transaction tr;
int tr_num;
parameter ADDR_WIDTH = 16;
parameter SRAM_ADDR_WIDTH = ADDR_WIDTH - 2;
parameter SRAM_DEPTH = 1 << (SRAM_ADDR_WIDTH);
bit[31:0] sram_gld[SRAM_DEPTH];
logic[31:0] sram_gld_rdata;
logic[31:0] sram_dut_rdata;
int err_cnt = 0;
extern function new(mailbox mon2scb_mbx, int tr_num);
extern function build();
extern task check();
extern task run();
endclass
function scoreboard::new(mailbox mon2scb_mbx, int tr_num);
this.mon2scb_mbx = mon2scb_mbx;
this.tr_num = tr_num;
endfunction
function scoreboard::build();
endfunction
task scoreboard::check();
repeat(tr_num)begin
mon2scb_mbx.get(tr);
if(tr.hsel && tr.htrans[1])begin
if(tr.hwrite)begin
case({tr.hsize[1:0], tr.haddr[1:0]})
4'b00_00:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][7:0] = tr.hwdata[7:0];
4'b00_01:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][15:8] = tr.hwdata[15:8];
4'b00_10:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][23:16] = tr.hwdata[23:16];
4'b00_11:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:24] = tr.hwdata[31:24];
4'b01_00:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][15:0] = tr.hwdata[15:0];
4'b01_10:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:16] = tr.hwdata[31:16];
4'b10_00:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:0] = tr.hwdata[31:0];
default:sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:0] = 32'hx;
endcase
end
else begin
sram_gld_rdata = 32'h0;
sram_dut_rdata = 32'h0;
case({tr.hsize[1:0], tr.haddr[1:0]})
4'b00_00:
begin
sram_gld_rdata[7:0] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][7:0];
sram_dut_rdata[7:0] = tr.hrdata[7:0];
end
4'b00_01:
begin
sram_gld_rdata[15:8] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][15:8];
sram_dut_rdata[15:8] = tr.hrdata[15:8];
end
4'b00_10:
begin
sram_gld_rdata[23:16] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][23:16];
sram_dut_rdata[23:16] = tr.hrdata[23:16];
end
4'b00_11:
begin
sram_gld_rdata[31:24] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:24];
sram_dut_rdata[31:24] = tr.hrdata[31:24];
end
4'b01_00:
begin
sram_gld_rdata[15:0] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][15:0];
sram_dut_rdata[15:0] = tr.hrdata[15:0];
end
4'b01_10:
begin
sram_gld_rdata[31:16] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:16];
sram_dut_rdata[31:16] = tr.hrdata[31:16];
end
4'b10_00:
begin
sram_gld_rdata[31:0] = sram_gld[tr.haddr[ADDR_WIDTH-1:2]][31:0];
sram_dut_rdata[31:0] = tr.hrdata[31:0];
end
default:
begin
sram_gld_rdata[31:0] = 32'hx;
sram_dut_rdata[31:0] = tr.hrdata[31:0];
end
endcase
if(sram_gld_rdata !== sram_dut_rdata)begin
$display("&&@%t::ERROR::sram_gld_rdata(%h) !== sram_dut_rdata(%h) at haddr(%h)", $time, sram_gld_rdata, sram_dut_rdata, tr.haddr[ADDR_WIDTH-1:2]);
err_cnt++;
end
end
end
end
endtask
task scoreboard::run();
check();
if(err_cnt == 0)begin
$display("*********************************************");
$display("*********************************************");
$display("******************TEST PASS******************");
$display("*********************************************");
$display("*********************************************");
end
else begin
$display("*********************************************");
$display("*********************************************");
$display("*****TEST FAILD WITH %d ERRORS*******",err_cnt);
$display("*********************************************");
$display("*********************************************");
end
endtask
`endif
scoreboard.sv
最新推荐文章于 2023-04-13 11:06:10 发布