2.2.2 加入factory机制

上一节给出了一个只有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机制。

时间: 2024-10-13 11:23:39

2.2.2 加入factory机制的相关文章

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

factory机制的一大特点就是根据类的名字来创建类的实例. factory 机制中根据类名来创建类的实例所用到的技术:一是参数化的类,二是静态变量和静态函数.这两者是factory机制实现的根本所在. UVM 中有两大关键类,uvm_object 和 uvm_component.一个 uvm_object 在定义时一般要调用 uvm_object_utils 宏,而一个 uvm_component 在定义时要调用uvm_component_utils宏.factory所有的操作都通过这两个宏来

UVM的factory机制

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

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

从名字上面就知道,uvm_factory用来制造uvm_objects和component.在一个仿真过程中,只有一个factory的例化存在. 用户定义的object和component types通过typedef或者宏在factory中注册,factory产生和保存轻量级的代理(proxy): 1.  uvm_object_registry #(T,Tname) for objects 2.  uvm_component_registry #(T,Tname) for components

UVM中factory机制的使用

UVM中的factory机制一般用在sequence的重载,尤其是virtual sequence.当Test_case变化时,通过virtual sequence的重载,可以很容易构建新的测试. 因为virtual可以控制选择sequence,sequence的启动,执行顺序等. 在build_phase阶段,不需要改变default_sequence,不需要改变别处代码. Transaction的重载,可以在不改变sequence,default_sequence的情况下,改变Transac

UVM:9.2.2 小而美与factory 机制的重载

1.小而美与factory 机制的重载 2.原始A_driver 的drive_one_pkt 如下: 1)分成3个子任务. 2)如果要构造sfd 错误的例子,只需要从A_driver 派生B_driver,并重载drive_sfd 即可. 3.如果不是分成3个子任务,而是一个完整的任务: 1)那么在B_driver  中需要重载的是整个drive_one_pkt 这个任务: 此时,其他两个子函数的代码要复制到drive_one_pkt 中,容易产生错误.代码要重用,可以封装成可重载的函数/任务

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

1.create_object_by_name,根据类名字创建object,原型: 一般只用第一个: 2.create_object_by_type,根据类型创建一个object,原型: 一般只用第一个: 3.create_component_by_name,根据类名创建一个component,原型: 1)第一个类名. 2)第二个父节点全名. 3)第三个新的component名字. 4)第四个父节点指针. 4个都要用: 一般在component 的new 或者build_phase 中使用.如果

UVM:8.2.4 factory 机制的调试

1.UVM提供了print_override_info 帮助debug,以上节new_monitor 为例: 2.调用print_override_info : 结果: 实际调用debug_create_by_name. 3.还提供debug_create_by_type,原型: 1)应用: 输出与上面相同. 4.uvm_factory 还提供print 函数,原型: 1)参数可能为0,1,2.0打印最少,2打印最多. 5.uvm_root 的print_topology 打印UVM 树的拓扑结

UVM/OVM中的factory【zz】

原文地址:http://bbs.eetop.cn/viewthread.php?tid=452518&extra=&authorid=828160&page=1 在新的项目中再次用到了UVM,距离上次项目自己写UVM代码已经快一年,所以很多UVM的细节东西自己也记不太清楚了,只能记得UVM各个点的主线,这次重拾UVM,又重点看到了factory部分,所以就在此mark一下,做个笔记. 在记录中肯定有不对和偏颇的地方,一个人的看法毕竟有死角,所以看到不会的地方请大家及时拍砖和轻喷.

与uvm_componentt相关的factory宏

1.uvm_component_utils:它用于把一个直接或间接派生自uvm_component的类注册到factory中. 2.uvm_component_param_utils:它用于把一个直接或间接派生自uvm_component的参数化的类注册到factory中. 3.uvm_component_utils_begin uvm_component_utils_end:类似uvm_object_utils_begin ……uvm_object_utils_end,它用于同时需要使用fac