scb_before:之前的scb,测试用例0/1/3未通过;
代码如下:
`ifndef SCOREBOARD_SV
`define SCOREBOARD_SV
class scoreboard;
int tr_num;
mailbox agt2scb_mbx = new();
mailbox mon2scb_mbx = new();
transaction tr = new();
//定义golden_model参数
parameter ADDR_WIDTH = 16;
parameter SRAM_ADDR_WIDTH =ADDR_WIDTH -2;
parameter SRAM_DEPTH = 1<<(SRAM_ADDR_WIDTH);
logic [31:0]sram_gld[SRAM_DEPTH ];
int err_cnt = 0;
extern function new(mailbox agt2scb_mbx,mailbox mon2scb_mbx, int tr_num);
extern function build();
extern task start();
extern task check(bit [31:0] addr, bit [31:0] rdata, bit [1:0]hsize);
extern task run();
endclass
function scoreboard::new(mailbox agt2scb_mbx,mailbox mon2scb_mbx, int tr_num);
this.agt2scb_mbx = agt2scb_mbx ;
this.mon2scb_mbx = mon2scb_mbx ;
this.tr_num= tr_num;
endfunction
function scoreboard::build();
endfunction
task scoreboard:: start();
repeat(tr_num)begin
mon2scb_mbx.get(tr);
if(tr.hsel && (tr.htrans==2'b10)) 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_01: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'b01_11: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]]= tr.hwdata[31:0];
4'b10_01:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
4'b10_10:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
4'b10_11:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
default:begin
sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= 32'hx;
$display("@%0t:ERROR::MISMATCH*, tr.hsize=%0d, tr.haddr[1:0]=%0b",$time ,tr.hsize,tr.haddr[1:0]);
err_cnt++;
end
endcase
end
else begin
check(tr.haddr, tr.hrdata, tr.hsize);
end
end
end
endtask
task scoreboard:: check(bit [31:0] addr, bit [31:0] rdata, bit [1:0]hsize);
bit [31:0] exp;
exp = sram_gld[addr[ADDR_WIDTH-1:2]];
if(exp !== rdata)begin
$display("@%0t: addr = %0h; exp = %0h; rdata= %0h; ERROR::exp !== rdata, hsize = %0d, addr[1:0] = %0b;",$time,addr,exp,rdata,hsize,addr[1:0]);
err_cnt++;
end
endtask
task scoreboard::run();
start();
if(err_cnt == 0)begin
$display("**********************************************");
$display("**********************************************");
$display("*****************TEST PASS*******************");
$display("**********************************************");
$display("**********************************************");
end
else begin
$display("**********************************************");
$display("**********************************************");
$display("*****************TEST FAILD*******************",err_cnt);
$display("**********************************************");
$display("**********************************************");
end
endtask
`endif
scb:修改后的scb,测试用例全部通过;
代码如下:
`ifndef SCOREBOARD_SV
`define SCOREBOARD_SV
class scoreboard;
int tr_num;
mailbox agt2scb_mbx = new();
mailbox mon2scb_mbx = new();
transaction tr = new();
//定义golden_model参数
parameter ADDR_WIDTH = 16;
parameter SRAM_ADDR_WIDTH =ADDR_WIDTH -2;
parameter SRAM_DEPTH = 1<<(SRAM_ADDR_WIDTH);
logic [31:0]sram_gld[SRAM_DEPTH ];
int err_cnt = 0;
extern function new(mailbox agt2scb_mbx,mailbox mon2scb_mbx, int tr_num);
extern function build();
extern task start();
extern task check(exp,hrdata);
extern task run();
endclass
function scoreboard::new(mailbox agt2scb_mbx,mailbox mon2scb_mbx, int tr_num);
this.agt2scb_mbx = agt2scb_mbx ;
this.mon2scb_mbx = mon2scb_mbx ;
this.tr_num= tr_num;
endfunction
function scoreboard::build();
endfunction
task scoreboard:: start();
bit [31:0] exp;
repeat(tr_num)begin
mon2scb_mbx.get(tr);
if(tr.hsel && (tr.htrans==2'b10)) 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_01: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'b01_11: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]]= tr.hwdata[31:0];
4'b10_01:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
4'b10_10:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
4'b10_11:sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= tr.hwdata[31:0];
default:begin
sram_gld[tr.haddr[ADDR_WIDTH-1:2]]= 32'hx;
$display("@%0t:ERROR::MISMATCH*, tr.hsize=%0d, tr.haddr[1:0]=%0b",$time ,tr.hsize,tr.haddr[1:0]);
err_cnt++;
end
endcase
end
else begin
exp = sram_gld[tr.haddr[ADDR_WIDTH-1:2]];
check(exp, tr.hrdata);
end
end
end
endtask
task scoreboard:: check(exp,hrdata);
if(exp !== hrdata)begin
$display("@%0t: exp = %0h; hrdata= %0h; ERROR::exp !== hrdata",$time,exp,hrdata);
err_cnt++;
end
endtask
task scoreboard::run();
start();
if(err_cnt == 0)begin
$display("**********************************************");
$display("**********************************************");
$display("*****************TEST PASS*******************");
$display("**********************************************");
$display("**********************************************");
end
else begin
$display("**********************************************");
$display("**********************************************");
$display("*****************TEST FAILD*******************",err_cnt);
$display("**********************************************");
$display("**********************************************");
end
endtask
`endif
自学不易,慢慢努力: