The UVM Primer 笔记

The UVM Primer 源码与中文翻译:http://bbs.eetop.cn/thread-611621-1-1.html

目录

OOP部分

UVM部分


OOP部分

 

  • BFM :一般指interface driver 中的DUT接口时序。
  • OOP 最开始应用于C++ 和 Java。
  • 结构体struct 是静态的,仿真器会在struct声明是分配内存,而类 class在调用构造函数new()为对象显示分配内存。
  • class继承extends后,new()构造函数如果有参数,必须显示调用,写出super.new()。不管子类是否重载new()函数,都要显式调用父类的构造函数。
class rectangle;
    int length;
    int width;
    
    function new(int l, int w);
      length = l;
      width  = w;
    endfunction
    
    function int area();
      return length * width;
    endfunction
  endclass
  
  class square extends rectangle;
  
    function new(int side);
      super.new(.l(side), .w(side));
    endfunction
  
  endclass
  
  module top_class ;
    rectangle rectangle_h;
    square    square_h;
    
    initial begin
    
      rectangle_h = new(.l(50),.w(20));
      $display("rectangle area: %0d", rectangle_h.area());
      
      square_h = new(.side(50));
      $display("square area: %0d", square_h.area());
      
    end
  endmodule
  • 如果父类的task/function已经用virtual修饰,子类没有必要在加上virtual了。
  • 静态变量和静态方法,通过class_name:: 直接调用,静态方法只能操作静态变量,为了可读性,一般直接访问静态变量不是个好习惯,可以封装到静态方法中。
  • 静态变量在类定义时分配内存空间,当通过 " :: " 访问时,编译器会在我们类的命名空间中访问静态变量。
  • protected static para; protected修饰静态变量,保护作用,防止类外部修改。

local:只允许类本身访问,需经过类本身的成员进行访问;

protected:允许类本身和它的扩展类访问;

const:分为两种:全局性、instance性的

其中,

全局性const:在声明时即赋值,之后不可修改;

instace性const:只使用const进行声明,赋值发生在new()中

  • factory模式:丰富了例化一个类的方式。可以通过传入string 类型的class type,创建一个类。避免hardcoding:

       好处就是通过字符串创立实例,便于脚本管理。

         以下为类的多态内容:

        父类句柄 = 子类句柄 ; 可以,因为父类句柄调用的变量/方法,子类中一定有。

         但是 子类句柄 = 父类句柄 ; 不可以,因为子类中的变量/方法,父类中不一定有。

        在调用animal_h.make_sound(); 时,实际是lion的方法,因为animal_h 实际指向lion的object,且make_sound() 被virtual修饰,动态调用方法(根据object)。 不过没有virtual修饰,则是静态调用方法(根据handle)。

         如果调用animal_h.thorn_in_paw 则报错,因为 thorn_in_paw 不属于父类的变量,这是多态的的限制。

         要通过$cast转换成lion_h 句柄,在调用。

class lion extends animal;

   bit              thorn_in_paw = 0;

   function new(int age, string n);
      super.new(age, n);
   endfunction : new

   function void make_sound();
      $display ("The lion, %s, says Roar", get_name());
   endfunction : make_sound
   
endclass : lion


直接实例化:
lion   lion_h;
lion_h = new(15, "Mustafa");


factory模式:

class animal_factory;

   static function animal make_animal(string species, 
                                      int age, string name);
      chicken chicken;
      lion lion;
      case (species)
        "lion" : begin
           lion = new(age, name);
           return lion;
        end

        "chicken" : begin
           chicken = new(age, name);
           return chicken;
        end

        default : 
          $fatal (1, {"No such animal: ", species});
        
      endcase // case (species)
      
   endfunction : make_animal
   
endclass : animal_factory

animal animal_h;
lion   lion_h;

animal_h = animal_factory::make_animal("lion", 15, "Mustafa");
animal_h.make_sound();

if (lion_h.thorn_in_paw) $display("He looks angry!");
      animal_cage#(lion)::cage_animal(lion_h);

cast_ok = $cast(lion_h, animal_h);


UVM部分

猜你喜欢

转载自blog.csdn.net/Holden_Liu/article/details/104230184