AHB-SRAMC-修改scb,测试用例全部通过

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

自学不易,慢慢努力:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MCDF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值