抽象类和纯虚方法
抽象类:即可以被扩展但是 不能被直接实例化的类,它使用“ virtual”关键字进行定义。
纯虚方法:这是一种没有实体的方法原型。
- 一个由抽象类扩展而得来的类只有在所有虚方法都有实体的时候才能被例化。
- 关键词“pure”表明一个方法声明是原型定义,而不仅仅是空的虚方法。
- 纯虚方法只能在抽象类中定义,但是抽象类中也可以定义非纯方法。
使用纯虚方法的抽象类
/*
可以声明BaseTr类型的句柄,但是却不能创建该类型的对象,
需要首先扩展该类并对所有的纯虚方法提供具体实现。
*/
virtual class BaseTr;
static int count; //需要创建的实例数
int id; //唯一的事务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
Transaction类扩展了抽象类
class Transaction extends BaseTr;
rand bit[31:0] src, dst, data[8];
extern virtual function bit compare(input BaseTr to);
extern virtual function BaseTr copy(input BaseTr to=null);
extern virtual function void display(input string prefix="");
extern virtual function void copy_data(input Transaction copy);
extern virtual new();
endclass
Transaction方法的实体
function bit Transaction::compare(input BaseTr to);
Transaction tr;
assert($cast(tr,to)); //检查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 void 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("%sTransaction%0d src=%h, dst=%%x, crc=%x", prefix, id, src, dst, crc);
endfunction : display
function Transaction::new();
super.new();
endfunction : new
---------------------
作者:煎丶包
来源:CSDN
原文:https://blog.csdn.net/qq_39794062/article/details/113423688
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件