The UVM Primer 源码与中文翻译:http://bbs.eetop.cn/thread-611621-1-1.html
目录
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:
好处就是通过字符串创立实例,便于脚本管理。
- 扩展 OOP中的单例模式:https://blog.csdn.net/Holden_Liu/article/details/99183577
- 下面例子中,animal_factory::make_animal() 静态方法返回的是lion类型的object,但是指向了animal类型的句柄。
以下为类的多态内容:
父类句柄 = 子类句柄 ; 可以,因为父类句柄调用的变量/方法,子类中一定有。
但是 子类句柄 = 父类句柄 ; 不可以,因为子类中的变量/方法,父类中不一定有。
在调用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);