2.3.6-加入scoreboard

在验证平台中加入了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所示的形式。

时间: 2024-10-12 08:08:16

2.3.6-加入scoreboard的相关文章

poj 3335 Rotating Scoreboard(半平面交)

Rotating Scoreboard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6420   Accepted: 2550 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the ed

POJ 3335 Rotating Scoreboard(半平面交 模板)

题目链接:http://poj.org/problem?id=3335 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the edges of the polygon. We want to place a rotating scoreboard somewher

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

题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spectators are seated along the edges of the polygon. We want to place a rotating scoreboard somewhe

Rotating Scoreboard(半平面交模板题)

Rotating Scoreboard http://poj.org/problem?id=3335 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8506   Accepted: 3357 Description This year, ACM/ICPC World finals will be held in a hall in form of a simple polygon. The coaches and spe

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

题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的内核? 它是平面简单多边形的核是该多边形内部的一个点集,该点集中任意一点与多边形边界上一点的连线都处于这个多边形内部.就是一个在一个房子里面放一个摄像 头,能将所有的地方监视到的放摄像头的地点的集合即为多边形的核. 如上图,第一个图是有内核的,比如那个黑点,而第二个图就不存在内核了,无论点在哪里,总

POJ 3335 Rotating Scoreboard 半平面交求多边形内核

题目大意:多边形求内核模板题 思路:半平面交,我用的是O(nlogn)的半平面交,但是有一个问题,就是当多边形内核是一个点的时候,半平面交所得到的答案是空集合,但是输出应该是yes,实在没有什么好的解决方法,最后只能把所有直线向右移动,然后在求内核.但是这样做eps的不同取值有的时候能A有的时候不能A.有没有什么好的解决方法啊!!!求解答啊!!! CODE: #include <cmath> #include <cstdio> #include <cstring> #i

Rotating Scoreboard - POJ 3335(半面相交求多边形内核)

题目大意:RT 分析:所谓内核可以理解为在多边形内存在点可以在这个点上看到多边形内部所有的部分,当然怎么求出来就是问题的关键了.我们知道多边形的每条边都是边界值,边的左边和右边肯定是一部分属于多边形一部分属于多边形外,如果这个多边形是顺时针的话那么右边就属于里面,左边就属于外边,如果这条变的外边那么一定是看不到这条边的了,所以可以排出.具体做法如下: 如上图所示:这个多边形按照顺时针来的,有5个顶点,分别是12345,首先我们先把边12拿出,发现,123都属于边12的右边,45不属于,所以可以吧

POJ 3335 Rotating Scoreboard

题目大意:同   POJ3130 解题思路:同   POJ3130 POJ3130解题报告:点此进入 注意:两个题给出点的顺序不一样.不要老是抄模版(我不会告诉你我就是这么做的). 下面是代码: #include <set> #include <map> #include <queue> #include <math.h> #include <vector> #include <string> #include <stdio.h

POJ3335:Rotating Scoreboard——题解

http://poj.org/problem?id=3335 题目大意:给按照顺时针序的多边形顶点,问其是否有内核. —————————————————————————————— 看了两个小时的资料,对板子敲了一个小时,终于将简单的板子题弄过了. (原本计划去搞风水那道题,但发现我等级的太低了……需要从基础练起半平面交) 代码参考:http://blog.csdn.net/accry/article/details/6070621 理解参考:http://blog.csdn.net/acm_zl