具体内容参加绿皮书,
virtual method
class Transaction;
rand bit[31:0] src,dst,data[8];
bit[31:0]crc;
virtual function void calc_crc();
crc=src^dst^data.xor;
endfunction
endclass :Transaction
class BadTr extends Transaction;
rand bit bad_crc;
virtual function void calc_crc();
super.calc_crc();
if(bad_crc) crc = ~crc;
endfunction
endclass;BadTr
使用不同类型句柄的一个代码块
Transaction tr;
BadTr bad;
initial begin
tr = new();
tr.calc_crc(); //调用Transaction::calc_crc
bad = new();
bad.calc_crc(); //调用BadTr::calc_crc
tr = bad; //基类句柄指向扩展类
tr.calc_crc(); //调用BadTr::calc_crc
end
这里由于calc_crc定义为了virtual,所以最后一步tr.calc_crc(); 会根据对象类型调用BadTr::calc_crc,而非句柄类型调用Transaction::calc_crc。
如果没有定义为virtual calc_crc,会根据句柄类型调用Transaction::calc_crc。
BaseTr 是一个virtual class, 可被声明,可以被extend, 但是不能被实例化。
可以定义 function, virtual function,pure virtual function
pure virtual function 是只有定义,没有实体的方法,只可以在virtual class中定义。
virtual class BaseTr;
static int count;
int id;
function new();
id=count++;
endfunction
pure virtual function bit compare(input BaseTr to);
pure virtual function BaseTr copy(input BaseTr to=null);
pure virtual function void display(input string prefix="");
endclass: BaseTr
BaseTr BT; // 正确可以执行
BT = new(); //会报错。
pure virtual function 只有在扩展类中定义了实体,才可以使用
class Transaction extends BaseTr;
rand bit[31:0] src, dst,crc, data[8];
external virtual function bit compare(input BaseTr to);
external virtual function BaseTr copy(input BaseTr to=null);
external virtual function void copy_data(input Transaction copy);
external virtual function void display(input string prefix="");
external function new();
endclass
//下面是方法实体
function bit Transaction ::compare(input BaseTr to);
Transaction tr;
assert($cast(tr,to));
return ( (this.src == tr.src) &&
(this.dst == tr.dst) &&
(this.crc == tr.crc) &&
(this.data == tr.data));
);
endfunction: compare
function BaseTr Transaction ::copy(input BaseTr to=null);
Transaction cp;
if(to ==null) cp =new();
else $cast(cp,to);
copy_data(cp);
return cp;
endfunction
function BaseTr Transaction ::copy_data(Transaction copy);
copy.src = src;
copy.dst = dst;
copy.data = data;
copy.crc = crc;
endfunction
function void Transaction ::display(string prefix="");
$display("%s Transaction %0d src =%h, dst = %%x, crc= %x ",prefix,id,src,dst,crc);
endfunction
function void Transaction ::new();
super.new();
endfunction