zoukankan      html  css  js  c++  java
  • 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机制。

  • 相关阅读:
    【面向对象】面向对象之属性继承(三)
    【面向对象】面向对象编程思维(二)
    【面向对象】面向对象编程思维(一)
    .net System.TypeInitializationException 类型初始值设定项引发异常
    您对无法重新创建的表进行了更改或者启用了“阻止保存要求重新创建表的更改”选项
    Bootstrap教程
    jQuery 定时局部刷新(setInterval)方法总结
    VS2010常用插件介绍之Javascript插件(一)
    本周进步要点(第3周1.9--1.15)
    聊一聊小程序
  • 原文地址:https://www.cnblogs.com/YINBin/p/6822576.html
Copyright © 2011-2022 走看看