class driver #(parameter DSIZE=8);
// 定义名为 driver 的类,DSIZE 参数默认为 8
virtual fifoPorts itf;
// 声明一个虚拟的 FIFO 接口 itf
rand logic [DSIZE-1:0] wdata;
// 申明一个大小为 DSIZE 的随机逻辑位数组 wdata
mailbox WMbx;
// 声明一个邮箱(mailbox)类型的变量 WMbx,用于存储写入的数据
mailbox GMbx;
// 声明一个邮箱(mailbox)类型的变量 GMbx,用于接收来自 golden model 的数据
packet pkt;
// 声明一个数据包(packet)类型的变量 pkt
function new (virtual fifoPorts itf, mailbox GMbx, mailbox WMbx);
// 定义任务 new,用于初始化对象
this.itf = itf;
// 将传入的虚拟 FIFO 接口赋值给类成员变量 itf
this.WMbx = WMbx;
// 将传入的写邮箱赋值给类成员变量 WMbx
this.GMbx = Gmbx;
// 将传入的 golden model 邮箱赋值给类成员变量 GMbx
endfunction
task Write (input int putInMbx, input int writeNumber);
// 定义任务 Write,用于执行数据写入操作
int i = 0;
// 声明并初始化一个整型变量 i,表示写入的数据数量
$display("%0t:INFO:Driver.Write task,Start Writing..writeNumber=%0d",$time,writeNumber);
// 在控制台输出调试信息,显示开始写入数据的时间和写入的数据数量
do begin
// 执行 do-while 循环,直到达到指定的写入数据数量
if (!itf.full_pre) begin
// 如果 FIFO 接口未满(full_pre 为 false),则执行以下内容
GMbx.get(pkt);
// 从 golden model 的邮箱中获取一个数据包
this.itf.wcb.winc <= 1;
// 将 FIFO 接口的写使能信号设置为 1,表示进行写入操作
this.itf.wcb.wdata <= pkt.data;
// 将数据包中的数据写入到 FIFO 接口的写数据信号中
pkt.opt = WR;
// 设置数据包的操作类型为写操作
if (putInMbx) begin
// 如果 putInMbx 参数为真,则执行以下内容
this.WMbx.put(pkt);
// 将数据包推入写邮箱中
end
@(posedge itf.wclk);
// 等待 FIFO 接口的写时钟上升沿
i++;
// 数据计数加一
end
else begin
// 如果 FIFO 接口已满,则执行以下内容
this.itf.wcb.winc <= 0;
// 将 FIFO 接口的写使能信号设置为 0,表示暂停写入操作
@(posedge itf.wclk);
// 等待 FIFO 接口的写时钟上升沿
begin :wd_timer_fork
// 定义命名块 wd_timer_fork
fork:wfull_wd_timer
// 定义一个 fork 块,用于检测 FIFO 是否恒为满状态
begin
while (itf.full_pre) begin
// 当 FIFO 接口一直处于满状态时执行循环
@(posedge itf.wclk);
// 等待 FIFO 接口的写时钟上升沿
end
end
begin
repeat(1000) @(posedge itf.wclk);
// 在 FIFO 接口不再为满状态后等待 1000 个时钟周期
$display("\n%m\n[ERROR]%t fifo always full,write job timed out!\n",$realtime);
// 在控制台输出错误信息,提示写入操作超时
$display("\n%m\n[ERROR]%t only write %d data!\n",$realtime,i);
// 在控制台输出错误信息,提示实际写入的数据数量
$display("\n%m\n[ERROR]%t still left %d data!\n",$realtime,writeNumber-i);
// 在控制台输出错误信息,提示剩余未写入的数据数量
$finish;
// 终止仿真
end
join_any:wfull_wd_timer
// 定义一个 join_any 块,用于等待 fork 块中的所有线程结束
disable fork;
// 禁用 fork 块中的所有线程
end
end
end while (i < writeNumber);
// 循环执行以上操作直到达到指定的写入数据数量
this.itf.wcb.winc <= 1'b0;
// 将 FIFO 接口的写使能信号设置为 0,表示结束写入操作
$display("%0t:INFO:Driver.Write task,END Writing",$time);
// 在控制台输出调试信息,显示结束写入数据的时间
endtask
endclass
driver.sv
于 2023-11-06 21:16:37 首次发布