SV中的class通過new來創建實例,new函數可以傳遞多個參數;
packet P1; P1 = new;創建一個P1的對象;
P2 = P1;P2也指向同一個對象;
P2 = new P1;P2是P1的shadow copy,指針直接被copy。
對於參數化的class的new函數調用:new函數可以通過類操作符::來調用
class E#(type T = int) extends C;
T x;
function new(T x_init)
super.new();
x=x_init;
endfunction
endclass
initial begin
C = E#(.T(byte))::new(.x_init(5));
end
一個class中的static類型的property包括:static聲明的變量,typedefs,enumeration,parameter,local parameter,
static constraint,structure,union,
static的method,主要指定義的static類型的function、task,其中不能使用非static的變量和this 指針。
class的聲明定義,typedef class class_name;
SV中的class都是單繼承,single inheritance,baseclass中的property和method都被subclass所復用。
baseclass的handle可以指向subclass object,此時的參數引用,完全根據handle的類型來確定。
baseclass中也可以控制data或者method的作用范圍,local,表示只能被該class中的method使用,protect,表示可以被該class
或者subclass使用,
class中的const變量,分為global const,與static聲明類似,在class中聲明時,直接賦值,
instance const,在class中只是做了聲明,在new中做了賦值(因為只能做一次),這類const是不能使用static的。
virtual method,在subclass中的時候,會直接override掉baseclass中的function。不需要調用this。
並且只會根據對象的類型,來調用function。
virtual function可以override掉一個同名的function,但是聲明過virtual之后,必須都是用virtual做override。
還可以定義一種virtual class其中只定義pure virtual function,做原型定義。(class中是不允許有pure virtual function的)
SV中的多態性,主要表現在virtual function的動態調用,以及對象之間的動態$cast。
super關鍵字,來調用baseclass中的變量和函數,this,是預定義的指向該調用object的指針類型,使用該class中的變量和函數。
繼承類到baseclass的例化是一條chain constructors;
在繼承類的new函數中,應該首先調用super.new(),來例化baseclass中值,
$cast的原型,function int / task $cast (dest, src) 只有:
1) src是dest的superclass handle,
2) src是一個interface class時,此時指向的可以是一個extends的class,cast可以成功;
類范圍操作符,左側不可以是一個class的實例,只能是一個class的類型;
類范圍操作符“::”,可以被class,package,covergroup,coverpoint,cross,typedef等使用在左側,右側表示內部的變量名。
主要用在:1)內部static變量和method的調用。
2) extern的function的外部實現。
參數化的類:parameterized class,通過參數化定義,在實現時,可以自己配置,specialization,
可以分為value的參數化和type的參數化,參數化定義時,可以指定默認值,被extend的時候,按需指定
參數化的class,使用類范圍操作符時,必須有type或者value的時候,除非有默認的值。
interface class,只能在其中定義pure virtual function,typedef,parameter等變量。
通過implements掛載在相應的class中,不同於extend,interface class只是實現了function。
implement可以在一次extends中實現多個。
interface class經過implement之后,被extends的class,可以直接將對象賦給implement的interface class句柄。
但是只能調用該interface中的function。