`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 语句块,防止重复定义类```