scoreboard.sv

`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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jealky

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

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

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

打赏作者

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

抵扣说明:

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

余额充值