在验证平台中加入了reference model和monitor之后,最后一步是加入scoreboard。my_scoreboard的代码如下:


代码清单 2-50
文件:src/ch2/section2.3/2.3.6/my_scoreboard.sv
  3 class my_scoreboard extends uvm_scoreboard;
  4   my_transaction  expect_queue[$];
  5   uvm_blocking_get_port #(my_transaction)  exp_port; //expected-port
  6   uvm_blocking_get_port #(my_transaction)  act_port;  //actually received-port
  7   `uvm_component_utils(my_scoreboard)
  8
  9    extern function new(string name, uvm_component parent = null);
 10   extern virtual function void build_phase(uvm_phase phase);
 11   extern virtual task main_phase(uvm_phase phase);
 12 endclass
 13
 14 function my_scoreboard::new(string name, uvm_component parent = null);
 15   super.new(name, parent);
 16 endfunction
 17
 18 function void my_scoreboard::build_phase(uvm_phase phase);
 19   super.build_phase(phase);
 20   exp_port = new("exp_port", this);
 21   act_port = new("act_port", this);
 22 endfunction
 23
 24 task my_scoreboard::main_phase(uvm_phase phase);
 25   my_transaction  get_expect,  get_actual, tmp_tran;
 26   bit result;
 27
 28   super.main_phase(phase);
 29   fork
 30     while (1) begin  //进程1
 31       exp_port.get(get_expect);
 32       expect_queue.push_back(get_expect);
 33     end
 34     while (1) begin  //进程2
 35       act_port.get(get_actual);
 36       if(expect_queue.size() > 0) begin
 37         tmp_tran = expect_queue.pop_front();
 38         result = get_actual.my_compare(tmp_tran);
 39         if(result) begin
 40            `uvm_info("my_scoreboard", "Compare SUCCESSFULLY", UVM_LOW);
 41         end
 42         else begin
 43            `uvm_error("my_scoreboard", "Compare FAILED");
 44            $display("the expect pkt is");
 45            tmp_tran.my_print();
 46            $display("the actual pkt is");
 47            get_actual.my_print();
 48         end
 49       end
 50       else begin
 51         `uvm_error("my_scoreboard", "Received from DUT, while Expect Que ue is empty");
 52         $display("the unexpected pkt is");
 53         get_actual.my_print();
 54       end
 55    end
 56  join
 57 endtask


my_scoreboard要比较的数据一是来源于reference model,二是来源于o_agt的monitor。前者通过exp_port获取,而后者通过act_port获取。在main_phase中通过fork建立起了两个进程,一个进程处理exp_port的数据,当收到数据后,把数据放入expect_queue中;另外一个进程处理act_port的数据,这是DUT的输出数据,当收集到这些数据后,从expect_queue中弹出之前从exp_port收到的数据,并调用my_transaction的my_compare函数。采用这种比较处理方式的前提是exp_port要比act_port先收到数据。由于DUT处理数据需要延时,而reference model是基于高级语言的处理,一般不需要延时,因此可以保证exp_port的数据在act_port的数据之前到来。

act_port和o_agt的ap的连接方式及exp_port和reference model的ap的连接方式与2.3.5节讲述的i_agt的ap和reference model的端口的连接方式类似,这里不再赘述。

代码清单2-50中的第38行用到了my_compare函数,这是一个在my_transaction中定义的函数,其原型为:


代码清单 2-51

文件:src/ch2/section2.3/2.3.6/my_scoreboard.sv

 54    function bit my_compare(my_transaction tr);
 55       bit result;
 56
 57       if(tr == null)
 58          `uvm_fatal("my_transaction", "tr is null!!!!")
 59       result = ((dmac == tr.dmac) &&
 60                (smac == tr.smac) &&
 61                (ether_type == tr.ether_type) &&
 62                (crc == tr.crc));
 63       if(pload.size() != tr.pload.size())
 64          result = 0;
 65       else
 66          for(int i = 0; i < pload.size(); i++) begin
 67             if(pload[i] != tr.pload[i])
 68               result = 0;
 69          end
 70       return result;
 71    endfunction

它逐字段比较两个my_transaction,并给出最终的比较结果。

完成my_scoreboard的定义后,也需要在my_env中将其实例化。此时,整棵UVM树变为如图2-8所示的形式。

2.3.6-加入scoreboard的更多相关文章

  1. 【POJ 3335】 Rotating Scoreboard (多边形的核- - 半平面交应用)

    Rotating Scoreboard Description This year, ACM/ICPC World finals will be held in a hall in form of a ...

  2. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  3. poj 3335 Rotating Scoreboard(半平面交)

    Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6420   Accepted: 25 ...

  4. 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard

    山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  5. POJ 3335 Rotating Scoreboard(半平面交 多边形是否有核 模板)

    题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a ...

  6. poj 3335 Rotating Scoreboard (Half Plane Intersection)

    3335 -- Rotating Scoreboard 给出一个多边形,要求判断它的内核是否存在. 还是半平面交的题,在这道题中,公告板允许其所在位置与直线共线也算是可见,于是我们就可以将每一条直线微 ...

  7. CF#637 D. Nastya and Scoreboard DP

    D. Nastya and Scoreboard 题意 一块电子屏幕上有n个数字. 每个数字是通过这样7个线段显示的,现在你不小心打坏了k个线段,给出打坏之后的n个数字的显示方式,问之前的屏幕表示的最 ...

  8. POJ 3335 Rotating Scoreboard(多边形的核)

    题目链接 我看的这里:http://www.cnblogs.com/ka200812/archive/2012/01/20/2328316.html 然后整理一下当做模版.0换成eps,会wa,应该要 ...

  9. POJ 3335 Rotating Scoreboard(半平面交求多边形核)

    题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...

随机推荐

  1. MVC框架入门准备(二) - 语言包类与工厂模式

    语言包类: 相关配置项 LANG_FOLDER : 语言包目录名,默认为Lang LANG_AUTO : 自动识别语言,默认为true DEFAULT_LANG : 默认语言,默认为zh-cn方法 取 ...

  2. 洛谷P5284 [十二省联考2019]字符串问题(SAM+倍增+最长路)

    题面 传送门 题解 首先,我们把串反过来,那么前缀就变成后缀,建一个\(SAM\).我们发现一个节点的后缀是它的所有祖先 那么我们是不是直接按着\(parent\)树建边就可以了呢? 显然不是.我们假 ...

  3. C++中运算符的优先级

    运算符挺多的,很难一一记住他们的优先级,在此去别人博客复制以下内容,供自己以后学习. 优先级 运算符 含    义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 ...

  4. [CSS3] 动画暗角按钮

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. linux中创建一个回收站

      1. mkdir /tmp/trash_tmp 建立一个回收站目录 2. vi /bin/trash 编辑一个文件     mv $@ /tmp/trash_tmp     :wq 保存退出 3. ...

  6. jmeter服务器监控插件下载配置

    jmeter想要监控服务器CPU.内存.磁盘.网络等相关资源需要借助plugins插件 下载jmeter性能监控插件 1.下载jmeterPlugins-Standard和jmeterPlugins- ...

  7. Unity 下集成第三方原生 SDK,以极光厂商通道为例

    Unity中集成三方SDK有两种方式: Unity 项目开发中时常有集成 Android 第三方 SDK 的需求,比如接入第三方推送,分享等功能.而第三方 SDK 的集成文档提到的往往是基于原生 An ...

  8. oracle常用cmd命令

    登陆 sqlplus username/password; 切换: conn username/password; 显示当前登陆用户: show user; 查看用户列表 select usernam ...

  9. power designer和uml应用

    1.power designer和uml应用,它们可以帮助我们画图power designer还能在画图时帮助你完成代码.对于新手是很合适的一个画图工具, 2.这就是power designer 的示 ...

  10. leetcode-209-长度最小的子数组

    题目描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...