synopsys svtb lab3:Self-Checking

前言

欢迎您,有缘人!文章涉及的代码太多,比较站篇幅,需要代码和文档去代码需要翻看synopsys svtb lab1:SystemVerilog Verification Flow的前言部分获取。


完成这个实验,你应该会:

  1. 构造一个从路由器输出端进行取样的监视器(Monitor)。
  2. 构造一个可以验证路由器输出的比较器(Checker)。
  3. 运行Driver和Monitor程序,检验Checker能否正确比数。 

在该实验完成时,你将得到如下验证结构。

Lab Overview

任务1:将solution/lab2下的文件拷贝到lab3下

make copy

任务2:创建顶层测试环境Top-Level Test Environment

  1. 编辑已存在的test.sv文件。
  2. 给pkt2cmp_payload[$]序列添加一个全局声明(global-declaration),位宽为8bit(logic[7:0])。这个序列将会被用来存储来自于DUT的取样数据。
  3. 为了能够进行自我核对,修改程序使recv()和send()可以并行进行,并在其后添加一个自我核对程序check()。

任务3:实现一个监视器Monitor

  1. 声明一个recv() 任务task。
  2. 在recv()体中调用get_payload()来获取有效负载。(在目前这是这是recv()程序中的唯一内容,在后面的实验中我们会在添加一些内容。)
  3. 声明get_payload()任务。
  4. 在get_payload()中,删除掉pkt2cmp_payload[$]的内容。(删掉来自之前数据包的可能剩余物是十分有必要的)
  5. 继续在get_payload()之中,等待输出端frame信号的下降沿。

 

fork

      begin: wd_timer_fork

      fork: frameo_wd_timer

        @(negedge rtr_io.cb.frameo_n[da]); //this is a thread by itself

        begin                              //this is another thread

          repeat(1000) @(rtr_io.cb);

      $display("\n%m\n[ERROR]%t Frame signal timed out!\n", $realtime);

          $finish;

        end

      join_any: frameo_wd_timer

      disable fork;

      end: wd_timer_fork

    join

6.通过在路由器的输出端口取样来继续完善get_payload():

  1. 保持循环直到frame信号被检测到
  2. 在循环中,至少8个时钟周期内聚合起一个字节(8bit)的数据。接着将每一个8位数据存储到pkt2cmp_payload[$]序列中去。
forever begin

      logic[7:0] datum;

      for(int i=0; i<8; i=i)  begin //i=i prevents VCS warning messages

        if(!rtr_io.cb.valido_n[da])

          datum[i++] = rtr_io.cb.dout[da];

        if(rtr_io.cb.frameo_n[da])

          if(i==8) begin //byte alligned

        pkt2cmp_payload.push_back(datum);

        return;      //done with payload

      end

7.如果payload没有连成一个byte,就打印错误信息并终止仿真。

else begin

        $display("\n%m\n[ERROR]%t Packet payload not byte aligned!\n", $realtime);

        $finish;

      end

        @(rtr_io.cb);

      end

      pkt2cmp_payload.push_back(datum);

    end

任务4:实现比较器(Checker)

这一步是为了发展一个比较器从而去检查路由器的输出。

  1. 创建一个compare()函数,它可以返回一个bit的值并且可以进行数据比较
  2. 在compare()中,比较payload[$]队列(用来参考的数据)和pkt2cmp_payload[$] 队列取样的数据)中存储的数据来验证接收到的payload是否正确。
    1. 如果payload[$]序列和pkt2cmp_payload[$]队列的长度不匹配的话,设置描述该错误的语句,并返回0值结束该子程序。
    2. 如果在payload[$]队列和pkt2cmp_payload[$]队列的数据不匹配,设置描述该错误的语句,并返回0值和结束该子程序。(你可以用“==”来直接比较两个序列)。
    3. 如果在payload[$]队列和pkt2cmp_payload[$]队列中的数据是完全一致的,设置描述比较成功的语句,并返回1值和结束该子程序。
  3. 创建check()任务。
  4. 在check()体中,声明一个string(字符串)变量和一个计数器。
  5. 在check()体内,调用compare函数来核对接收到的数据。
    1. 如果一个错误被发现了,则打印错误信息并终止仿真。
    2. 如果核对是成功的,则打印一个信息来表明比较成功和查到的数据包的数量。
  6. 保存并关闭test.v文件。

任务5:编译和仿真

任务6:测试所有端口

  1. 修改你的测试程序来随机产生sa(源地址)和da(目标地址)。
  2. 将你的Testbench拓展到可以发送2000个数据包。
  3. 编译和仿真你的程序。
  4. 确定仿真依然可以完全成功。

任务7:检测错误的rtl

make bad


后记

这个系列实验果然有难度,不过一步一步地明白一些东西怎么加上去的。加快进度,在研究生入学前,学完uvm。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杰之行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值