上一节给出了一个只有driver、使用UVM搭建的验证平台。严格来说这根本就不算是UVM验证平台,因为UVM的特性几乎一点都没有用到。像上节中my_driver的实例化及drv.main_phase的显式调用,即使不使用UVM,只使用简单的SystemVerilog也可以完成。本节将会为读者展示在初学者看来感觉最神奇的一点:自动创建一个类的实例并调用其中的函数(function)和任务(task)。

要使用这个功能,需要引入UVM的factory机制:

代码清单 2-7
文件:src/ch2/section2.2/2.2.2/my_driver.sv
3 class my_driver extends uvm_driver;
4
5 `uvm_component_utils(my_driver)
6 function new(string name = "my_driver", uvm_component parent = null);
7 super.new(name, parent);
8 `uvm_info("my_driver", "new is called", UVM_LOW);
9 endfunction
10 extern virtual task main_phase(uvm_phase phase);
11 endclass
12
13 task my_driver::main_phase(uvm_phase phase);
14 `uvm_info("my_driver", "main_phase is called", UVM_LOW);
15 top_tb.rxd <= 8'b0;
16 top_tb.rx_dv <= 1'b0;
17 while(!top_tb.rst_n)
18 @(posedge top_tb.clk);
19 for(int i = 0; i < 256; i++)begin
20 @(posedge top_tb.clk);
21 top_tb.rxd <= $urandom_range(0, 255);
22 top_tb.rx_dv <= 1'b1;
23 `uvm_info("my_driver", "data is drived", UVM_LOW);
24 end
25 @(posedge top_tb.clk);
26 top_tb.rx_dv <= 1'b0;
27 endtask

factory机制的实现被集成在了一个宏中:uvm_component_utils。这个宏所做的事情非常多,其中之一就是将my_driver登记在UVM内部的一张表中,这张表是factory功能实现的基础。只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。那么factory机制到底是什么?这个宏还做了哪些事情呢?这些属于UVM中的高级问题,本书会在后文一一展开。

在给driver中加入factory机制后,还需要对top_tb做一些改动:

代码清单 2-8
文件:src/ch2/section2.2/2.2.2/top_tb.sv
7 module top_tb;

36 initial begin
37 run_test("my_driver");
38 end
39
40 endmodule

这里使用一个run_test语句替换掉了代码清单2-6中第23到28行的my_driver实例化及main_phase的显式调用。运行这个新的验证平台,会输出如下语句:
new is called
main_phased is called

一个run_test语句会创建一个my_driver的实例,并且会自动调用my_driver的main_phase。仔细观察run_test语句,会发现传递给它的是一个字符串。UVM根据这个字符串创建了其所代表类的一个实例。如果没有UVM,读者自己能够实现同样的功能吗?

根据类名创建一个类的实例,这是uvm_component_utils宏所带来的效果,同时也是factory机制给读者的最初印象。只有在类定义时声明了这个宏,才能使用这个功能。所以从某种程度上来说,这个宏起到了注册的作用。只有经过注册的类,才能使用这个功能,否则根本不能使用。请记住一点:所有派生自uvm_component及其派生类的类都应该使用uvm_component_utils宏注册。

除了根据一个字符串创建类的实例外,上述代码中另外一个神奇的地方是main_phase被自动调用了。在UVM验证平台中,只要一个类使用uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会自动被调用。这也就是为什么上一节中会强调实现一个driver等于实现其main_phase。所以,在driver中,最重要的就是实现main_phase。

上面的例子中,只输出到“main_phase is called”。

令人沮丧的是,根本没有输出“data is drived”,而按照预期,它应该输出256次。

关于这个问题,牵涉UVM的objection机制。

2.2.2 加入factory机制的更多相关文章

  1. UVM的factory机制

    在UVM中使用工厂模式基本上分为三个步骤: 1. 注册 当定义一个类的时候,它的类型必须要注册,UVM已经提供了专用的宏. `uvm_component_utils(class_type_name) ...

  2. UVM中factory机制的使用

    UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因 ...

  3. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...

  4. UVM基础之-------uvm factory机制override<博>

    override功能是UVM中一个比较重要的功能,这个功能也是在factory里面实现的,我们会在env或者具体的case中使用override功能. class case_x extends bas ...

  5. UVM基础之---------uvm factory机制register

    factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在 ...

  6. UVM基础之---------uvm factory机制base

    从名字上面就知道,uvm_factory用来制造uvm_objects和component.在一个仿真过程中,只有一个factory的例化存在. 用户定义的object和component types ...

  7. UVM:8.2.4 factory 机制的调试

    1.UVM提供了print_override_info 帮助debug.以上节new_monitor 为例: 2.调用print_override_info : 结果: 实际调用debug_creat ...

  8. UVM:8.4.3 用factory 机制创建实例的接口

    1.create_object_by_name,依据类名字创建object,原型: 一般仅仅用第一个: 2.create_object_by_type.依据类型创建一个object,原型: 一般仅仅用 ...

  9. uvm设计分析——factory

    uvm的factory机制,通过实例一个static类型default factory,并且通过宏将所有例化extend出来的object,component register到该factory的内部 ...

随机推荐

  1. 神器与经典--DMVsinSQLServer

    前言: 在不经意间发现这个SQL,正能量瞬间饱满,赶紧向周边的人分享,私藏是罪过啊! 请复制粘贴然后F5,经典无须多说! /************************************** ...

  2. StarUML3.0选择不同类型图和导出

    StarUML(简称SU),是一种创建UML类图,生成类图和其他类型的统一建模语言(UML)图表的工具. 可绘制9款UML图:用例图.类图.序列图.状态图.活动图.通信图.构件图.部署图以及复合结构图 ...

  3. sqlite批量处理数据性能优化

    最近设计到sqlite数据库批量操作的,性能很是问题.于是一番研究(站在巨人肩膀)从网上整理出来相关性能优化方向.大体分三个级别,一般第一个阶段已足够. 1.sqlite每次插入数据(每调用一次sql ...

  4. Android 与 iOS 推送 Push Notification 的区别

    Android 安卓使用 GCM (Google Cloud Messaging) 接收推送,然后应用根据实际情况决定做什么反应,比如显示一个 Notification. 所以安卓下,推送 Push ...

  5. yum 下载RPM包而不进行安装

    yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了--downloadonly(只下载)的选项来达到这个目的. $ sudo yum install --downloadonly < ...

  6. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  7. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  8. 十招谷歌 Google 搜索

    十招谷歌搜索 一.或者 OR 二.网址 insite:example.com keyword 三.大约 1.类似查询(记得) ~keyword 2.模糊查询(记得) key*****word 3.模糊 ...

  9. 题目1003:A+B(字符串转数字)

    问题来源 http://ac.jobdu.com/problem.php?pid=1003 问题描述 每次给你两个数,数的形式是每三位有一个间隔符',',计算两数之和. 问题分析 两个问题,一.如何读 ...

  10. QuantLib 金融计算——数学工具之插值

    目录 QuantLib 金融计算--数学工具之插值 概述 一维插值方法 二维插值方法 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之插值 载入模块 ...