driver.sv

文章描述了一个类Driver,其中包含初始化任务new和数据写入任务Write,通过FIFO接口与goldenmodel进行数据交换,处理写入操作的超时和数据完整性检查。
摘要由CSDN通过智能技术生成
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C4HCS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值