scoreboard.sv

`ifndef SCB_SV
`define SCB_SV
class  scoreboard #(parameter DSIZE=8);
     mailbox WMbx,RMbx;
     bit [DSIZE-1:0] wdata,rdata;
     packet wpkt,rpkt;
     function new(mailbox WMbx,RMbx);
          this.WMbx=WMbx;
          this.RMbx=RMbx;
          this.wrc=new();
     endfunction

     covergroup wrc;
           winc_cp:coverpoint this.wpkt.data{
                       bins zero ={0};
                       bins low={1,2,3,4};
                       bins med ={5,6};
                            ignore_bins high={7};
           }
     endgroup

     task printMbxContent (input mailbox mbx,string message);
           int mbxElements;
           packet pkt;
           bit[DSIZE-1:0] mbxData;
           packet q[$];
           mbxElements=mbx.num();
           for (int i=0;i<mbxElements;i++)begin
                mbx.get(pkt);
                q.push_back(pkt);
           end

           $write ("%s",message);

           foreach(q[i])begin
                $write ("%b",q[i].data);
                mbx.put(q[i]);     
           end
           $display("");

     endtask

     task compareData;
          int loopw,loopr;
          printMbxContent(WMbx,"Golden Data is");
          printMbxContent(RMbx,"Actual Data is");
          $display("\n %0t:INFO:Scoreboard.Compare task,Start Comparing..",$time);
          loopw=WMbx.num();
          loopr=RMbx.num();
          if(loopw!=loopr)begin
                $display("%0t:INFO:<><>FIALED for size-mismatch<><>",$time);
          end
          else begin
                for (int i=0;i<loopw;i++)begin
                     WMbx.get(this.wpkt);
                     RMbx.get(this.rpkt);
                     wrc.sample();
                     if (wpkt.data==rpkt.data)
                         $display("%0t:INFO:Scoreboard:PASS:Read and Write data are the SAME:%b==%b",$time,this.rpkt.data,this.wpkt.data);
                     else
                        $display("%ot:INFO:Scoreboard:<><>Fail:Read and Write data are Different:(R)%b==(W)%b",$time,this.rpkt.data,this.wpkt.data);

                end
          end
     endtask
     
     
endclass
`endif

`ifndef SCB_SV
// 如果 SCB_SV 宏未定义,则执行以下内容
`define SCB_SV
// 定义 SCB_SV 宏

class  scoreboard #(parameter DSIZE=8);
// 定义名为 scoreboard 的类,DSIZE 参数默认为 8

     mailbox WMbx,RMbx;
     // 声明两个邮箱(mailbox)类型的变量 WMbx 和 RMbx,分别表示写邮箱和读邮箱

     bit [DSIZE-1:0] wdata,rdata;
     // 声明两个数据位宽为 DSIZE 的位变量 wdata 和 rdata,分别表示写数据和读数据

     packet wpkt,rpkt;
     // 声明两个数据包(packet)类型的变量 wpkt 和 rpkt,分别表示写包和读包

     function new(mailbox WMbx,RMbx);
     // 定义任务 new,用于初始化对象
          this.WMbx=WMbx;
          // 将传入的写邮箱赋值给类成员变量 WMbx
          this.RMbx=RMbx;
          // 将传入的读邮箱赋值给类成员变量 RMbx
          this.wrc=new();
          // 初始化覆盖组 wrc
     endfunction

     covergroup wrc;
     // 定义覆盖组 wrc
           winc_cp:coverpoint this.wpkt.data{
           // 定义覆盖点 winc_cp,表示写包的数据
                       bins zero ={0};
                       // 新建一个名为 zero 的 bin,包含数值 0
                       bins low={1,2,3,4};
                       // 新建一个名为 low 的 bin,包含数值 1、2、3、4
                       bins med ={5,6};
                       // 新建一个名为 med 的 bin,包含数值 5、6
                            ignore_bins high={7};
                       // 新建一个名为 high 的 bin,忽略包含数值 7 的数据
           }
     endgroup

     task printMbxContent (input mailbox mbx,string message);
     // 定义任务 printMbxContent,用于打印邮箱中的内容
           int mbxElements;
           // 声明一个整型变量 mbxElements,表示邮箱中元素的数量
           packet pkt;
           // 声明一个数据包类型的变量 pkt
           bit[DSIZE-1:0] mbxData;
           // 声明一个位宽为 DSIZE 的位变量 mbxData
           packet q[$];
           // 声明数据包类型的数组 q

           mbxElements=mbx.num();
           // 获取邮箱元素数量
           for (int i=0;i<mbxElements;i++)begin
           // 循环遍历邮箱中的元素
                mbx.get(pkt);
                // 取出一个数据包
                q.push_back(pkt);
                // 将该数据包推入 q 数组中
           end

           $write ("%s",message);
           // 在控制台输出传入的提示信息

           foreach(q[i])begin
           // 遍历 q 数组中的元素
                $write ("%b",q[i].data);
                // 在控制台输出数据包中的数据
                mbx.put(q[i]);     
                // 将该数据包推回邮箱中
           end
           $display("");
           // 在控制台换行

     endtask

     task compareData;
     // 定义任务 compareData,用于比较写入和读取数据的一致性
          int loopw,loopr;
          // 声明两个整型变量 loopw 和 loopr,分别表示写邮箱和读邮箱中元素的数量
          printMbxContent(WMbx,"Golden Data is");
          // 调用 printMbxContent 函数,打印写邮箱中的内容
          printMbxContent(RMbx,"Actual Data is");
          // 调用 printMbxContent 函数,打印读邮箱中的内容
          $display("\n %0t:INFO:Scoreboard.Compare task,Start Comparing..",$time);
          // 在控制台输出调试信息
          loopw=WMbx.num();
          // 获取写邮箱中元素的数量
          loopr=RMbx.num();
          // 获取读邮箱中元素的数量
          if(loopw!=loopr)begin
          // 如果写邮箱和读邮箱中元素的数量不相等,则表示测试失败
                $display("%0t:INFO:<><>FIALED for size-mismatch<><>",$time);
          end
          else begin
          // 如果写邮箱和读邮箱中元素的数量相等,则进行数据比较
                for (int i=0;i<loopw;i++)begin
                     WMbx.get(this.wpkt);
                     // 从写邮箱中取出一个数据包
                     RMbx.get(this.rpkt);
                     // 从读邮箱中取出一个数据包
                     wrc.sample();
                     // 对覆盖组 wrc 进行采样
                     if (wpkt.data==rpkt.data)
                         $display("%0t:INFO:Scoreboard:PASS:Read and Write data are the SAME:%b==%b",$time,this.rpkt.data,this.wpkt.data);
                     else
                        $display("%ot:INFO:Scoreboard:<><>Fail:Read and Write data are Different:(R)%b==(W)%b",$time,this.rpkt.data,this.wpkt.data);

                end
          end
     endtask
     
     
endclass

`endif
// 结束 ifdef 语句块,防止重复定义类``` 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C4HCS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值